高精度乘法

来源:互联网 发布:淘宝红包链接怎么复制 编辑:程序博客网 时间:2024/06/02 00:21
#include<bits/stdc++.h>using namespace std;const int p=1000;const int N=1000;string s[2];int num[4]={1,10,100,1000};int a[2][N],l[2];int sum[N*2];int iter,itera,tmp;int main(){    ios::sync_with_stdio(false);//  cout<<s[0].size()<<' '<<s[1].size()<<endl;    for(int k=0;k<=1;k++){    cin>>s[k];    int shouwei0=0;    while(*(s[k].begin()+shouwei0)==48) //string的器到底指向哪儿啊?????     shouwei0++;    reverse(s[k].begin(),s[k].end());//  cout<<s[k]<<' '<<s[k].size()-shouwei0<<endl;    //success;    itera=0;    for(int i=0;i<s[k].size()-shouwei0;i++){        if(iter==3){            a[k][itera++]=tmp;            tmp=0;            iter=0;        }        tmp+=(s[k][i]-48)*num[iter++];    }    if(tmp){        a[k][itera++]=tmp;        tmp=0;        iter=0;    }    l[k]=itera;/*  for(int i=l[k]-1;i>=0;i--){        if(i==l[k]-1)   printf("%d",a[k][i]);        else printf("%04d",a[k][i]);    }    cout<<endl;*/  }    //开始乘了;//  cout<<l[0]<<' '<<l[1]<<endl;    //success;    for(int i=0;i<l[0];i++)    for(int j=0;j<l[1];j++){        sum[i+j]+=a[0][i]*a[1][j];//      cout<<sum[j]<<endl;     //success;//      system("pause");    }     int flag=0;    for(int i=N*2-1;i>=0;i--)        if(sum[i]){            flag=i;            break;  //注意break;         }    for(int i=0;i<=flag;i++){        sum[i+1]+=sum[i]/p;        sum[i]%=p;    }    for(int i=N*2-1;i>=0;i--)        if(sum[i]){            flag=i;            break;  //注意break;         }    int beacon=0;    for(;flag>=0;flag--){        if(!beacon){            printf("%d",sum[flag]);            beacon=1;        }        else printf("%03d",sum[flag]);    }    return 0;}

万进制并不稳定
数据大了之后乘法表中间的还是超了int范围
所以改用千进制过了洛谷这题;

fbi warning wwwwwwwwwwww

原创粉丝点击