计算大数阶乘
今天做了一道题,是计算大数阶乘的,起初使用大数乘法的方法做,没通过,后来调整了方法做还是没通过,思来想去不知道哪里有问题,最后将数组开大后终于AC了-----我giao!
输入
一个整数n(1<=n<=1000)
输出
对应的阶乘
第一种方法比较繁琐,先将乘数转换成数组后通过大数乘法的方法计算
#include<iostream>
using namespace std;
main()
{
int n,m;
int a[10000]={0},c[4]; //存放乘数
a[9999]=1;
cin>>n;
for(int i=1;i<=n;i++){ //从1-n
m = i;
int l = 3;
while(m>0){ //将乘数转化为数组
c[l] = m%10;
m = m/10;
l--;
}
int k=0;
int b[10000]={0}; //初始化b数组
for(int j=3;j>l;j--){
int jw=0;
for(int t=9999;t>=0;t--){
b[t-k] += (a[t]*c[j]+jw)%10; //将每个数乘a算出放入b中,然后相加,就类似于我们平常计算乘法时一样
jw = (a[t]*c[j]+jw)/10; //保存进位
}
k++;
}
for(int j=9999;j>=0;j--){
if(b[j]>9){ //将大于10的数进位
b[j-1]+=b[j]/10;
b[j]=b[j]%10;
}
}
for(int j=0;j<10000;j++){
a[j]=b[j]; //将b赋值给a便于下一个数计算
}
}
int judge=0;
for(int i=0;i<10000;i++){ //输出
if(a[i]>0) judge =1;
if(judge ==1){
cout<<a[i];
}
}
}
我上面这么写的时候虽然有点绕但还是能理解的,但是起初只给数组开了500,怎样都不能AC,然后我就感觉太复杂,重新又写了一遍
第二遍
#include<iostream>
using namespace std;
main()
{
int n,m;
int a[10000]={0};
a[9999]=1;
cin>>n;
for(int i=1;i<=n;i++){
int jw=0,mem;
for(int j=9999;j>=0;j--){
mem = (a[j]*i+jw)%10;
jw = (a[j]*i+jw)/10;
a[j]=mem;
}
}
int judge=0;
for(int i=0;i<10000;i++){
if(a[i]>0) judge =1;
if(judge ==1){
cout<<a[i];
}
}
}
第二次的代码简短了很多,而且易懂了很多,时间也用的少了