大数处理问题

1.求N的阶乘(10000以内的整数)

未优化前的代码

//计算 N!  30
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=50000;
int n,c,k,i,j,s;
int f[maxn+1];
int main() 
{
    while(cin>>n){
//        f[0]=1;
        memset(f,0,sizeof(f));
        f[0]=1;
        for(i=1;i<=n;i++){
            c=0;//表示进位
        for(j=0;j<=maxn;j++){
            s=f[j]*i+c;
            f[j]=s%10;
            c=s/10;
        } 
        }
        for(k=maxn;k>=0;k--)
        if(f[k]!=0) break;
        for(j=k;j>=0;j--)
        cout<<f[j];
        cout<<endl;
    }
}
View Code

优化后的代码输出有问题: 

eg:12!=479001600

程序输出:4790*1600 少了一个0 

//计算 N!  30
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=20000;
int n,c,k,i,j,s;
int f[maxn+1];
int main() 
{
    while(cin>>n){
//        f[0]=1;
        memset(f,0,sizeof(f));
        f[0]=1;
        for(i=1;i<=n;i++){
            c=0;//表示进位
        for(j=0;j<=maxn;j++){
            s=f[j]*i+c;
            f[j]=s%100000;
            c=s/100000;
        } 
        }
        for(k=maxn;k>=0;k--)
        if(f[k]!=0) break;
        for(j=k;j>=0;j--)
        cout<<f[j];
        cout<<endl;
    }
}
View Code

MOD数的设定与N的范围有关N最大为10^4 ,所以MOD设定10^5,相乘最大不超过九位

 解决问题后的正确代码:

//计算 N!  30
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=20000;
int n,c,k,i,j,s;
int f[maxn+1];
int main() 
{
    while(cin>>n){
//        f[0]=1;
        memset(f,0,sizeof(f));
        f[0]=1;
        for(i=1;i<=n;i++){
            c=0;//表示进位
        for(j=0;j<=maxn;j++){
            s=f[j]*i+c;
            f[j]=s%100000;
            c=s/100000;
        } 
        }

        for(k=maxn;k>=0;k--)
            if(f[k]!=0) break;
            cout<<f[k];
            for(j=k-1;j>=0;j--)
            printf("%05d",f[j]);//5位的数字不足前面添0 
            cout<<endl;
        }
}
View Code

2.

猜你喜欢

转载自www.cnblogs.com/helloworld2019/p/10549191.html