高精度乘法

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章