解题思路:
定义一个数组,存储每个位上的数
如a[0]代表个位上的数
a[1]代表十位上的数,接下来同理
Js函数是对阶乘进行计算并把计算结果存储到数组中去
现在对js数组进行讲解
1》外部的for循环显然是用于控制阶乘的,循环一次乘以一个数
2》第一个while用于控制i乘到最高位,如5!=120,i=6的时候,i只需要乘到1就好了,1就是120的最高位,初始化的数组的数据是-1,最高位的后面就是数据为-1的数了,这里乘好了之后每数组中的数是可以大于10的,下面的for循环就是用来进位的
3》内部的for循环,用于进位,每个位上的数一旦大于10就进位,进到最高位就停止,显然我写的最高位就是p-1位,但是为什么j到j<p-1的时候就停止呢?,因为j=p-2位时,j位上的数据存到j+1位上了,即p-1位上,最高位我们是要特殊处理的,最高位的后一位是小于0的数,进位的话很不方便
4》因此第二个while就是对最高位进行处理的,若最高位的数大于10,就进位到更高的位上,特殊地方特殊处理,当无法再满足进位的条件了,就停止进位,结束while循环。
进行下一次的外部的for循环,乘以下一个i
注意事项:
不管是个位、十位、千位和p位上的数,都是小于10的,且不小于0的数。故初始化的时候所有数都是-1
输出的时候从最高位进行输出,个位是放在最右边的,别输反了,,,
参考代码:
#include <iostream> #include <string.h> int a[5000]; using namespace std; int js(int a[],int n) { a[0]=1;int len; for(int i=1;i<=n;i++){ int p=0; while(a[p]!=-1){ a[p]*=i; p++; } for(int j=0;j<p-1;j++){ if(a[j]>9) a[j+1]+=a[j]/10; a[j]=a[j]%10; } while(a[p-1]>9){ a[p]=a[p-1]/10; a[p-1]=a[p-1]%10; p++; } len=p; } return len-1; } int main(int argc, char *argv[]) { int n; cin>>n; memset(a,-1,sizeof(a));//初始化,很好用的 a[0]=1; if(n==0) cout<<1<<endl; for(int i=js(a,n);i>=0;i--) cout<<a[i]; cout<<endl; return 0; }
数组可以存每个位的数,当然字符串也可以,个人建议用string型的字符串,好操作一些,在这里提供一个思考方法,本人的文章中有大数据的加法运算,用到的是字符串,有兴趣的话记得看一下,记得点赞和优化哦,谢谢
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复