C语言基础

C语言基础题

语言学习从菜鸟开始
高精度阶乘的和
描述

用高精度计算出S=1!+2!+3!+…+N!(N≤50),其中"!"表示阶乘,例如:5!=54321。

输入正整数N,输出计算结果S。

输入
每个测试文件只包含一组测试数据,每组输入一个正整数N。

输出
对于每组输入数据,输出阶乘和的计算结果。

输入样例 1

3
输出样例 1

9
解题思路:
1.题目关键字:高精度,所以普通的阶乘可能就不行啦,这是我们就可以用空间来换精确度。
2.定义两个数组,a[9999] ——>数组a的空间为9999,作用:储存在n内每一数字的阶乘,可以储存的位数为9999位。
3数组b ——>储存最终的答案,我习惯将最低位给第一位,(你也可以放最后面)
4.易错点:{数组a的初始化位置,这里我们将数组a的初始化位置放在最的for循环里,因为大循环是让1-——n之间的整数,进行阶乘,而我们数组a储存1-n之间的整数的阶乘结果,所以每次结束一个大循环后都要重新初始化数组a,在记录每一个}
{数组b储存最后的阶乘的结果,最后大循环执行完,数组b的结果为最终阶乘和的结果。所以在记录结果时数组每一个位置的的结果都是(0 – 9),但大于10时当前位置的值-10,下一个位置的数值加1}

#include

int main()
{
     
	int n,i,j,k,c;
	int b[9999]={
     0};
	scanf("%d",&n);
	if(n<=1)
	{
     
		printf("1");
		return 0;
	}
	for( i=1;i<=n;i++)//循环每一个数字是它进入下面的阶乘操作 
	{
     
		int a[9999] = {
     0};
		a[0] = 1;
		c = 0;
		for(j = 2;j<=i;j++)//进行每一个数字的阶乘操作
		{
     
			for(k = 0;k<9999;k++)
			{
     //这一个循环体,是将阶乘的结果储存在数组a
			//并且数组a的每一位上的值都在(0 -- 9)之间
				a[k] = a[k]*j+c;
				c = a[k]/10;
				a[k] = a[k]%10;
			}
		} 
		for(j = 0;j<9999;j++)
		{
     
			b[j] = b[j]+a[j];
			if(b[j]>=10)
			{
     
				b[j] = b[j]-10;
				b[j+1] = b[j+1]+1;	
			}	
		} 
	}
	for(j =9998;j>=0;j--)
	{
     
		if(b[j] !=0)
		{
     
			break;
		}
	}
	for(i = j;i>=0;i--)
	{
     
		printf("%d",b[i]); 
	}
	return 0;
}

感谢每一位看到这里的大神,如有错误请指出。感谢。
有需要做兼职的大学生,可加我(vx:yi202000036),我提供你一个门槛极低的兼职(有电脑即可),在宿舍就可以做

你可能感兴趣的:(C语言,c语言)