##问题来源
一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。
##一段比较完善的代码
int main(){
int n;
cin>>n;
int t;//进位
int m;//数组下标
int maxsize=1;//数组最大长度
int ans[1000]={0};
ans[0]=1;
for(int i=2;i<=n;i++){
t=0;
m=0;
while(m<maxsize){
int s=ans[m]*i+t;
ans[m]=s%10;
t=s/10;
m++;
}
if(t!=0){// 比较关键的是进位的处理,进位不一定都是个位数,有时会很大,这时候要进行处理
if(t>10){
int bi[11]={0},x=0;
while(t>0){
bi[x++]=t%10;
t/=10;
}
for(int q=0;q<x;q++)
ans[m++]=bi[q];
maxsize+=x;
}
else{
ans[m]=t;
maxsize++;
}
}
}
for(int i=maxsize-1;i>=0;i--)//逆序输出数组,即为阶乘的值
cout<<ans[i];
cout<<endl;
for(int x=0;x<maxsize;x++){//输出最右边第一个非零数
if(ans[x]!=0){
cout<<ans[x];
break;
}
}
return 0;
}
总结
1.每次循环不要忘了对进位进行初始化,即t=0;
2.进位t不一定是个位数,有时会是一个比较大的数字,当循环到最后一位的时候
数组要增加的位数就不止是一位了,所以要把t每一位拆开来存到一个新建的数组中,
然后再把新数组里面t的每一位,顺序赋值给结果数组进位的位置。
3.大数相乘其实很简单,结果数组的每一位与要乘的数相乘,结果的个位
还给原数组对应的位置,剩余几位作为进位,加入循环。
Eg:147*35,7*35=245(5代替结果数组7的位置,24作为进位),
4*35+24=164(4代替结果数组4的位置,16作为进位),
1*35+16=51(1代替结果数组1的位置,5作进位)。
得到结果数组ans={5,4,1,5};逆序输出得到答案5145.
来源:CSDN
作者:污喵王z
链接:https://blog.csdn.net/qq_40558345/article/details/104197725