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

样例输出

 

扫描二维码关注公众号,回复: 4460781 查看本文章
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:\n",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("\n\n");
    }    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/geziyu/p/10101443.html
axb