大整数乘法(zcmu-2152_1180)

在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a) memset(a,0,sizeof(a))
 
char a[10010];
char b[10010];
int aa[10010];
int bb[10010];
int cc[20010];
 
int main()
{
    while(~scanf("%s %s", a, b)){
        int la = strlen(a);
        int lb = strlen(b);
        int l = la+lb;
        int k = 0;
        for(int i = la-1; i >= 0; i--) aa[k++] = a[i]-'0';
        k = 0;
        for(int i = lb-1; i >= 0; i--) bb[k++] = b[i]-'0';
        mem(cc);
        for(int i = 0; i < la; i++){
            for(int j = 0; j < lb; j++){
                cc[i+j] += aa[i]*bb[j];
            }
        }
        int p = 0;
        for(int i = 0; i < l; i++){
            cc[i] += p;
            p = cc[i]/10;
            if(cc[i]>=10){
                cc[i] %= 10;
            }
        }
        int q;
        for(int i = l; i >= 0; i--){
            if(cc[i]!=0){
                q = i;
                break;
            }
            if(i==0) q = 0;
        }
        for(int i = q; i >= 0; i--){
            printf("%d", cc[i]);
        }
        printf("\n");
    }
    return 0;
}

在这里插入图片描述

一开始根据上面那题模拟,两两相乘,结果T了,下面是T了的代码。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a) memset(a,0,sizeof(a))
 
char a[10];
char b[10];
char d[10];
int c[10];
int aa[10];
int bb[10];
int cc[2000010];
int r[2000010];
int n;
int kk;
 
void sum(int l1, int l2, int tt)  // cc->l1 c->l2
{
    /*
    for(int i = l1-1; i >= 0; i--) cout << cc[i];
    cout << endl;
    for(int i = l2-1; i >= 0; i--) cout << c[i];
    cout << endl;
    */
    mem(r);
    for(int i = 0; i < l1; i++){
        for(int j = 0; j < l2; j++){
            r[i+j] += cc[i]*c[j];
        }
    }
    int p = 0;
    for(int i = 0; i < l1+l2; i++){
        r[i] += p;
        p = r[i]/10;
        if(r[i]>=10){
            r[i] %= 10;
        }
    }
    for(int i = l1+l2; i >= 0; i--){
        if(r[i]!=0){
            kk = i;
            break;
        }
        if(i==0) kk = 0;
    }
    /*
    for(int i = kk; i >= 0; i--){
        printf("%d", r[i]);
    }
    printf("\n");
    */
    if(tt==n-1){
        for(int i = kk; i >= 0; i--){
            printf("%d", r[i]);
        }
        printf("\n");
    }else{
        mem(cc);
        for(int i = kk; i >= 0; i--){
            cc[i] = r[i];
        }
    }
}
 
int main()
{
    int t;
    scanf("%d", &t);
    while(t--){
        scanf("%d", &n);
        scanf(" %s %s", a, b);
        int la = strlen(a);
        int lb = strlen(b);
        int l = la+lb;
        kk = 0;
        for(int i = la-1; i >= 0; i--) aa[kk++] = a[i]-'0';
        kk = 0;
        for(int i = lb-1; i >= 0; i--) bb[kk++] = b[i]-'0';
        mem(r);
        for(int i = 0; i < la; i++){
            for(int j = 0; j < lb; j++){
                r[i+j] += aa[i]*bb[j];
            }
        }
        int p = 0;
        for(int i = 0; i < l; i++){
            r[i] += p;
            p = r[i]/10;
            if(r[i]>=10){
                r[i] %= 10;
            }
        }
        for(int i = l; i >= 0; i--){
            if(r[i]!=0){
                kk = i;
                break;
            }
            if(i==0) kk = 0;
        }
        if(n==2){
            for(int i = kk; i >= 0; i--){
                printf("%d", r[i]);
            }
            printf("\n");
        }
        mem(cc);
        for(int i = kk; i >= 0; i--){
            cc[i] = r[i];
        }
        for(int i = 2; i < n; i++){
            scanf("%s", d);
            int lc = strlen(d);
            mem(c);
            int q = 0;
            for(int i = lc-1; i >= 0; i--){
                c[q++] = d[i]-'0';
                //cout << c[i];
            }
            //cout << endl;
            //cout << kk << " " << lc << endl;
            sum(kk+1,lc,i);
        }
    }
    return 0;
}
AC代码
#include<bits/stdc++.h>

using namespace std;

int num[10010];
int sum[100010];

int main()
{
    int t;
    scanf("%d", &t);
    while(t--){
        int n;
        scanf("%d", &n);
        int flag = 0;
        for(int i = 0; i < n; i++){
            scanf("%d", &num[i]);
            if(num[i]==0) flag = 1;
        }
        if(flag==1){
            printf("0\n");
            continue;
        }else{
            memset(sum,1,sizeof(sum));
            for(int i = 0; i < 100000; i++) sum[i] = 1;
            int l = 1;
            int p = 0; //进位
            for(int i = 0; i < n; i++){
                for(int j = 0; j < l; j++){
                    int x = sum[j]*num[i]+p;
                    sum[j] = x%10;
                    p = x/10;
                }
                while(p>0){
                    sum[l++] = p%10;
                    p /= 10;
                }
            }
            for(int i = l-1; i >= 0; i--){
                printf("%d", sum[i]);
            }
            printf("\n");
        }
    }
    return 0;
}
具体大数乘法原理可以戳下面学长的博客!

大数乘法详细步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值