解题思路:
定义一个数组,存储每个位上的数

如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型的字符串,好操作一些,在这里提供一个思考方法,本人的文章中有大数据的加法运算,用到的是字符串,有兴趣的话记得看一下,记得点赞和优化哦,谢谢

点赞(4)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

c晨光 6年前 回复TA
@夏洛克 教你一个方法,你自己把5!带进去,然后i等于6,进行计算,跑一遍就会觉得很简单了,我跟正常人想法不一样,,,别介意
夏洛克 6年前 回复TA
666
夏洛克 6年前 回复TA
进位和处理最高位看得我有点脑阔疼,可能理解能力实在不行。