乘以大数字

时间:2016-12-27 15:34:23

标签: c++ algorithm

我在这里和互联网上看到了很多答案,但我不需要一个大型的int库,我需要一个能够在c ++ / c中增加大数字的程序,但是真的很快,我尝试了不同的prorgams和一些他们的运行速度并不快,所以请帮我解决这个乘法问题,谢谢。

这是我尝试过的,它很好,但不是很快。它有效,但不适用于有1000位数的数字,请帮助我:

#include<iostream>
#include<fstream>
#include<string.h>
#define MAX 300000
using namespace std;
ifstream fin("test.in");
ofstream fout("test.out");
void reverse(char *from, char *to ){
    int len=strlen(from);
    int l;
    for(l=0;l<len;l++)to[l]=from[len-l-1];
    to[len]='\0';
}
void mult(char *first,char *sec,char *result){
    char F[MAX],S[MAX],temp[MAX];
    int f_len,s_len,f,s,r,t_len,hold,res;
    f_len=strlen(first);
    s_len=strlen(sec);
    reverse(first,F);
    reverse(sec,S);
    t_len=f_len+s_len;
    r=-1;
    for(f=0;f<=t_len;f++)temp[f]='0';
    temp[f]='\0';
    for(s=0;s<s_len;s++){
        hold=0;
        for(f=0;f<f_len;f++){
            res=(F[f]-'0')*(S[s]-'0')+hold+(temp[f+s]-'0');
            temp[f+s]=res%10+'0';
            hold=res/10;
            if(f+s>r)r=f+s;
        }
        while(hold!=0){
            res=hold+temp[f+s]-'0';
            hold=res/10;
            temp[f+s]=res%10+'0';
            if(r<f+s)r=f+s;
            f++;
        }
    }
    for(;r>0 && temp[r]=='0';r--);
    temp[r+1]='\0';
    reverse(temp,result);
}
int main(){
    char fir[MAX],sec[MAX],res[MAX];
    int m,n;
    fin>>m>>fir;
    n=strlen(fir);
    for(int i=0;i<n;i++)sec[i]=fir[i];
    for(int i=1;i<m;i++)
    {
      mult(fir,sec,res);
      int len=strlen(res);
      if(i<m-1)
      for(int j=0;j<len;j++)fir[j]=res[j];
      else for(int j=0;j<len;j++)fout<<res[j];
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

Toom-Cook algorithm可能是1000位数字的更好选择。它的工作原理是将输入数字分成较小尺寸的肢体,并从9次乘法减少到5次;在大约Θ(n ^ 1.465)中运行。

我不熟悉C ++ / C来编写这种算法。如果我是,我仍然不建议从头开始编写:请查看Marco Bodrato和Paul Zimmerman的Toom-Cook 3-way multiplication许可(GPL 2.0)代码。