• AxB Proplem(大数乘法)


    描述

    Redraiment碰到了一个难题,需要请你来帮忙:给你两个整数,请你计算A × B。

    输入

    数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。 
    接着有T组数据,每组数据只有一行,包括两个非负整数A和B。 
    但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。 
    但A和B的位数最大不会超过100位。

    输出

    对应每组测试数据,你都要输出两行: 
    第一行为:"Case #:", # 代表这是第几组测试数据。 
    第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。 
    你要注意这个等式里包含了几个空格。 
    要求每组数据之间都需要保留一个空行。

    样例输入

     

    2
    1 2
    123456789 987654321

    样例输出

     

    Case 1:
    1 * 2 = 2

    Case 2:
    123456789 * 987654321 = 121932631112635269
     
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    #define MAX 100
    
    int solve(char num1[],char num2[], int sum[])
    {
        int i, j, len, len1, len2;
        int a[MAX+10] = {0};
        int b[MAX+10] = {0};
        int c[MAX*2+10] = {0};
        
        len1 = strlen(num1);
        for(j = 0, i = len1-1; i >= 0; i--) //把数字字符转换为整型数 
            a[j++] = num1[i]-'0';
        len2 = strlen(num2);
        for(j = 0, i = len2-1; i >= 0; i--)
            b[j++] = num2[i]-'0';
        
        for(i = 0; i < len2; i++)//用第二个数乘以第一个数,每次一位 
        {
            for(j = 0; j < len1; j++)
            {
                c[i+j] += b[i] * a[j]; //先乘起来,后面统一进位
            }
        }
        
        for(i=0; i<MAX*2; i++) //循环统一处理进位问题
        {
            if(c[i]>=10)
            {
                c[i+1]+=c[i]/10;
                c[i]%=10;
            }
        }
    
        for(i = MAX*2; c[i]==0 && i>=0; i--); //跳过高位的0
            len = i+1; // 记录结果的长度 
        for(; i>=0; i--)
            sum[i]=c[i];
        return len; 
    }
    
    int main(){
        int i, len;
        int sum[MAX*2+10] = {0}; 
        int T;
        char num1[MAX+10];
        char num2[MAX+10];
        cin>>T;
        for(int j=1;j<=T;j++){
            cin>>num1>>num2;
            printf("Case %d:
    ",j);
            cout<<num1<<" * "<<num2<<" = ";
            if(strcmp(num1,"0")==0||strcmp(num2,"0")==0)
                cout<<"0";
            len = solve(num1,num2,sum);
            for( i = len-1; i>=0; i-- )
                cout<<sum[i];
            printf("
    
    ");
        }    
        return 0;
    }

  • 相关阅读:
    [导入]CodeSmith基础(六)
    [导入]CodeSmith基础(五)
    POJ 2229 Sumsets(经典2次幂和问题)
    UVa 10820 Send a Table(欧拉函数)
    UVa 571 Jugs(经典倒水问题)
    UVa 10717 Mint(LCM)
    UVa 10791 Minimum Sum LCM(素因子分解)
    汇编的艺术(01)sizeof operator
    UVa 11121 Base 2(负数进制)
    UVa 106 Fermat vs. Pythagoras(毕达哥拉斯定理)
  • 原文地址:https://www.cnblogs.com/geziyu/p/10101443.html
Copyright © 2020-2023  润新知