去年的老冷饭问题了,今年才解决。囧~(注:题目来源:洛谷,普及-)
题目如下:
用高精度计算阶乘之和S=1! + 2! + ··· + n!(n<=50)
本来我是打算通过编写递归函数计算的,思路倒是可以,但是unsigned long long数据类型还不够用就导致这道题不能完全AC
根据他人的思路得AC代码如下:
#include<stdio.h>//别忘了阶乘加和
int main(){
int i,A[105]={0},B[105]={0},n,j; //初始化A,B为全零数组
scanf("%d",&n);
A[0]=B[0]=1; //将A,B的第一个元素设置为1,表示0的阶乘是1
for(i=2;i<=n;i++){
for(j=0;j<100;j++){ //对于每个i,计算i的阶乘
B[j]=B[j]*i;
}
for(j=0;j<100;j++){ //处理B中元素进位问题
if(B[j]>9){
B[j+1]=B[j+1]+B[j]/10;
B[j]=B[j]%10;
}
}
for(j=0;j<100;j++){ //将B的结果加到A中
A[j]=A[j]+B[j];
if(A[j]>9){
A[j+1]=A[j+1]+A[j]/10;
A[j]=A[j]%10;
}
}
}
for(i=100;i>=0&&A[i]==0;i--); //找到A中第一个非零元素的位置
for(j=i;j>=0;j--){ //从该位置开始逆序打印A的元素
printf("%d",A[j]);
}
return 0;
}
//测试点数据超过一定数,用unsigned long long也不够,所以他们都用上了数组。
再次感谢给出题解的大佬:洛谷用户wuhao1027