本人蒟蒻一枚,欢迎帮助,欢迎与我讨论
有参考https://blog.csdn.net/qq_38863969/article/details/74167538
感谢这位大大以及我身边的学长的帮助
这篇博客主要是对我做题目的一些感想以及详解(以防以后忘记),也可以帮助一下以后的学弟学妹们
由于面向新手,我自己也是新手,所以很多地方有疏漏,或者太繁琐
基本上是在前辈们的基础上对程序进行的解析,补充说明
放题
题目描述
用高精度计算出S=1!+2!+3!+…+n!(n≤50)
其中“!”表示阶乘,例如:5!=5*4*3*2*1。
输入正整数N,输出计算结果S。
输入
一个正整数N。
输出
计算结果S。
样例输入
5
样例输出
153
放代码
/*涉及自定义函数的知识*/ /*请先了解高精加,高精乘*/ #include<bits/stdc++.h> using namespace std; int ans[105]/*阶乘和*/,jc[105]/*阶乘*/,jc1=100/*阶乘在数组中的位置*/,ans1=100/*阶乘和在数组中的位置*/; void pjc()//这个函数计算目前阶乘的最高位在数组中是第几个。 { int i=1; while(!jc[i])/*等价于(jc[i]==0)*/ i++;//如果非k[i]的话就执行,也就是说,当k[i]=0时,执行语句 jc1=i;//这个循环是在读前导0.比如0020前面有2个前导0,则20的最高位2在整个数组中是第3位 } void pans()//和上面原理一样,读的是ans的 { int i=1; while(!ans[i]) i++; ans=i; } void ljq()//这个函数是阶乘的累加器,此处运用高精乘 { for(int i=100;i>=jc1;i--)//注意阶乘的个位是在第100位,从i开始循环就是从个位开始加。直到加到最高位所在的数位为止 { ans[i]+=jc[i];//累加器加上阶乘一次得到的数 ans[i-1]+=ans[i]/10;//累加器前一位进的位是后一位的数除以10 ans[i]%=10;//后一位进位完只剩余数 } pans()//然后用pans函数读ans的位置; } /*主函数*/ int main() { int n; scanf("%d",&n);//输入 ans[100]=1;//从100开始存。注意50的阶乘只有65位 jc[100]=1;//第一次阶乘从1开始 /*此处为高精乘*/ for(int i=2;i<=n;i++)//第一次乘的数是2 { for(int j=100;j>=ans1;j--)//每一位都乘一遍i jc[j]*=i;//循环累乘 for(int j=100;j>=ans1;j--)//阶乘进位 { jc[j-1]+=jc[j]/10; jc[j]%=10; } pjc();//用这个函数读阶乘的位置 ljq();//把本次阶乘的结果存入累加器 } for(int i=ans1;i<=100;i++) printf("%d",ans[i]);//顺序输出 return 0; }