首页 > 代码库 > 1051:A × B problem 大数相乘

1051:A × B problem 大数相乘

给你两个整数,请你计算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

题目来源

ZJGSU

 

 

对于两个大数相乘,和一个大数乘上一个int有相识之处,要先把两个大数翻转一下,在进行模拟就ok了,

 

代码范例:

 1 #include <stdio.h> 2 #include <string.h> 3   4 #define N 210 5 int turn (char a[], int b[]); 6   7 int main () 8 { 9     int n, i, j, lena, lenb, yu, s;10     char a[N], b[N];11     int sum[N], A[N], B[N], l = 0;12  13     scanf ("%d", &n);14  15     while (n --)16     {17         scanf ("%s %s", a, b);18         if (l)19             printf ("\n");20         printf ("Case %d:\n%s * %s = ", ++l, a, b);21         memset (sum, 0, sizeof(sum));22         memset (B, 0, sizeof(B));23         memset (A, 0, sizeof(A));24         lena = turn(a, A);25         lenb = turn(b, B);26  27         for (i=0; i<lena; i++)28         {29             yu = 0;30             for (j=0; j<N; j++)31             {32                 s = sum[i+j] + yu + A[i] * B[j];33                 sum[i+j] = s % 10;34                 yu = s / 10;35             }36         }37  38         i = N - 1;39         while (sum[i] == 0)40             i--;41         for (; i>=0; i--)42             printf ("%d", sum[i]);43         printf ("\n");44     }45  46     return 0;47 }48  49 int turn (char a[], int b[])50 {51     int len, i, j;52     len = strlen(a);53  54     for (i=0, j=len-1; i<len; i++,j--)55         b[i] = a[j] - 0;56  57     return len;58 }

 

1051:A × B problem 大数相乘