c++大数据乘法和除法

来源:互联网 发布:深圳网络推手公司收费 编辑:程序博客网 时间:2024/05/21 10:16

  一直想不到怎么处理分位乘完每个位置上的数的位数怎么处理,突然想起来刚做的数学题里面有个log求位数的方法,就自己尝试优化了一下以前的代码

虽然还是有些冗长,但是处理起来不需要讨论位数的情况,除法的实现也进行了优化,主函数只进行了对大数阶乘然后除回来的测试,需要更大的数据可

以开更大的数组,但超时的概率就会大大增加,代码如下:

#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
int a[3001];
void chengfa(int n){
    for (int i=3000;i>=1;i--){
        a[i]*=n;
    }
    for (int i=3000;i>=1;i--)
    if (a[i]>=10){
    int x=log10(a[i]);
    int y=1;
    for (int j=1;j<=x;j++)y*=10;
    while (x){
        a[i-x]+=a[i]/y;
        a[i]=a[i]%y;
        x-=1;
        y/=10;
        }
    }
}
void chufa(int n){
    for (int i=1;i<=3000;i++){
        a[i+1]+=(a[i]%n)*10;
        a[i]/=n;
    }
}
int main(){
    int n,i;
    while (cin>>n){
        memset(a,0,sizeof(a));
        a[3000]=1;
        for (i=1;i<=n;i++){
            chengfa(i);
            }
        for (i=1;i<=3000;i++)
        if (a[i])break;
        for (;i<=3000;i++)cout<<a[i];
        cout<<endl;
        for (i=1;i<=n;i++){
            chufa(i);
            }
        for (i=1;i<=3000;i++)
        if (a[i])break;
        for (;i<=3000;i++)cout<<a[i];
        cout<<endl;
    }
}