A × B problem

描述

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 <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <math.h>

using namespace std;


int main()
{
    int T,map[100000],i,j,k,num1,num2,num3;
    scanf("%d",&T);
    getchar();
    char a[101],b[101];
    for(int o=1; o<=T; o++)
    {
        scanf("%s %s",&a,&b);
        num1 = strlen(a);
        num2 = strlen(b);
        getchar();
        printf("Case %d:\n%s * %s = ",o,a,b);
        if(strcmp(a,"0")==0 || strcmp(b,"0")==0)
            printf("0\n");
        else
        {
            memset(map,0,sizeof(map));
            for( i=0; i<num1; i++)
            {
                for( j=0; j<num2; j++)
                {
                    map[i+j] += (a[num1 -i-1]-'0')*(b[num2-j-1]-'0');
                    k = i+j;
                    while(map[k]>=10)
                    {
                        map[k+1]+=map[k]/10;
                        map[k]%=10;
                        k++;
                    }
                }
            }
            i = 9999;
            num3 = i;
            while(map[i]==0)
            {
                i--;
                num3=i;
            }
         //   printf("%d\n",num3);
            for(int i=num3; i>=0; i--)
                printf("%d",map[i]);
            printf("\n");
        }
        if(o!=T) printf("\n");
    }
    return 0;
}

代码为转载:http://blog.csdn.net/en_xiaogui/article/details/17231713

posted @ 2017-10-08 19:54  让你一生残梦  阅读(390)  评论(0编辑  收藏  举报