描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
输入正整数N,输出计算结果S。
输入
一个正整数N。
输出
计算结果S。
样例输入
5
样例输出
153
思路:我做这道题的时候结合了“大整数加法”和“求1000以内的阶乘”的方法。
求阶乘部分:
temp=1;//用来表示需要进行乘的位数个数
int a[10000]= {0};//定义一个临时数组,用来表示每一次阶乘的结果
a[0]=1;//初始化第一个元素为1
for (j=1; j<=i; j++)
{
for(k=0; k<temp; k++)//这两个for语句不能合并,会出错哦
a[k]*=j;
for (k=0; k<temp; k++)//将temp-1的每一位变成单个数
{
a[k+1]+=a[k]/10;;
a[k]=a[k]%10;
}
if(a[k]>0)
{
while (a[k]>9)//如果数字大于9,则进位
{
a[k+1]+=a[k]/10;;
a[k]=a[k]%10;
k++;
}
temp=k+1;//i当前的值可表示为求完一轮阶乘的位数,将i传递给k!
//由于i是从0开始,而k是代表所需要乘的位的次数数,所以是i+1.
}
相加部分:
for (j=0; j<=k; j++)//将大整数从低位到高位依次相加
{
s[j]=s[j]+a[j];
if(s[j]>9)//进位操作
{
s[j+1]+=s[j]/10;
s[j]%=10;
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n,i=0,j=0,k=0;
int s[10000]= {0}/*,a[10000]= {0}*/;
int temp=0,index;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
temp=1;
int a[10000]= {0};
a[0]=1;
for (j=1; j<=i; j++)
{
for(k=0; k<temp; k++)
a[k]*=j;
for (k=0; k<temp; k++)
{
a[k+1]+=a[k]/10;;
a[k]=a[k]%10;
}
if(a[k]>0)
{
while (a[k]>9)
{
a[k+1]+=a[k]/10;;
a[k]=a[k]%10;
k++;
}
temp=k+1;
}
}
for (j=0; j<=k; j++)
{
s[j]=s[j]+a[j];
if(s[j]>9)
{
s[j+1]+=s[j]/10;
s[j]%=10;
}
}
}
for (i=temp; i>=0; i--)
{
if(s[i]!=0)//从整数中第一个不为零的索引开始进行遍历输出
{
index=i;//index记录第一个不为零的下标
break;
}
}
for(i=index; i>=0; i--)//输出结果
{
printf("%d",s[i]);
}
return 0;
}