大整数乘法(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;
}
具体大数乘法原理可以戳下面学长的博客!

大数乘法详细步骤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: zcmu 1093 简单计算器是一道编程题目,要求实现一个简单的计算器,能够进行加、减、乘、除四种基本运算。该题目主要考察编程基础能力和算法思维能力,需要熟练掌握基本的运算符和控制语句,能够设计合理的算法实现计算器功能。 ### 回答2: zcmu 1093 简单计算器是一种基于计算机技术的工具,用于进行基本算术运算,如加减乘除等。它能够简化我们在日常生活中的计算工作,提高计算效率,减少出错率。 使用zcmu 1093 简单计算器非常简单,只需输入需要计算的数字和符号,就能够得到计算结果。它可以进行多个数字之间的复杂运算,同时还支持小数、百分数、平方根等复杂运算。另外,zcmu 1093 简单计算器还可以存储中间计算结果,方便我们进行多步计算或调整计算过程。 除了日常的计算工作,zcmu 1093 简单计算器还可用于科学计算、工程设计等领域。许多专业软件都是基于简单计算器原理设计的,它们具有更高的计算精度和更复杂的运算能力,能够支持更高级别的科学计算和技术分析。 总之,zcmu 1093 简单计算器在日常生活中有着广泛的应用,它使我们的计算工作变得更加高效、准确。并且,随着科技的不断发展,这种计算工具也在不断地更新和改进,为我们的计算工作提供更加便捷、多样化的选择。 ### 回答3: ZCMU 1093 简单计算器是一道基础的算法题目,需要实现一个简单的计算器程序,支持加、减、乘、除四种基本运算,可以对两个整数进行运算并输出结果。 要实现这道题目,首先需要根据输入的运算符来判断应该进行的运算类型,并根据运算符的不同,执行不同的计算操作。同时,应注意除数不能为零的情况,避免程序出现异常。 在编写程序的过程中,可以使用 switch case 语句来判断不同的运算类型,并执行相应的计算操作。同时,为了能有效地判断输入的运算符,可以使用输入字符串的方式进行处理,提取出运算符进行比较。 此外,在程序中还需要进行合法性判断,确保输入的数字均为整数且在合理的范围内,以避免程序运行出现异常情况。同时,还需要考虑输入格式的问题,应确保输入的数字和运算符符合题目要求。 综上所述,ZCMU 1093 简单计算器是一道基础的算法题目,需要实现一个简单的计算器程序,支持加、减、乘、除四种基本运算,注意程序的合法性判断和输入格式的处理,能够熟练地运用 switch case 等语句完成程序的编写。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值