大数相乘算法

蓝桥杯例题

当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,
可以采用字符串的方法来实现两个大数之间的乘法。具体来说,
首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,
然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),
最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,
则输出结果为:774980393241726.

算法设计思路-点击这里

算法实现代码C++

const int maxn = 100;
int a[maxn],b[maxn];
int len1,len2;
int ans[maxn];
char aim[maxn];

int main(){
    //freopen("in.txt","r",stdin);
    //读入并将数据方向反转
    memset(aim,0,sizeof(aim));
    scanf("%s",aim);
    len1 = strlen(aim);
    int cur = 0;
    for(int i=len1-1;i>=0;i--){
        a[cur++] = aim[i] - '0';
    }
    memset(aim,0,sizeof(aim));
    scanf("%s",aim);
    len2 = strlen(aim);
    cur = 0;
    for(int i=len2-1;i>=0;i--){
        b[cur++] = aim[i] - '0';
    }
    //完成输入
    memset(ans,0,sizeof(ans));
    for(int i=0;i<len1;i++){//a
        for(int k=0;k<len2;k++){//b
            //下面这句话要结合所给博客思路重点理解
            ans[i+k] += (a[i]*b[k]);
        }
    }
    //开始进位
    int jin = 0;
    for(int i=0;i<len1+len2;i++){
        ans[i] += jin;
        jin = ans[i] / 10;
        ans[i] %= 10;
    }
    //输出
    int s = len1 + len2;
    while(ans[s]==0)s--;
    for(int i=s;i>=0;i--){
        cout<<ans[i];
    }
    cout<<endl;
    return 0;
}
//774980393241726
//774980393241726

OK

posted @ 2020-10-15 17:24  SavenNeer  阅读(749)  评论(0编辑  收藏  举报