大数A+B A-B A*B;
在A-B是要判断AB的大小,我们要用大数减小数;
下面是我们oj的一个A*B的题;
链接:http://acm.zznu.edu.cn/problem.php?id=1562
题目描述
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<stdio.h> #include<string.h> #include<algorithm> #include<queue> using namespace std; #define N 1100 void change(char s[], int a[])///把字符串类型的s转化成数字倒着存入a中; { int j=0, len = strlen(s); for(int i=len-1; i>=0; i--) { a[j++] = s[i]-‘0‘; } } void Add(int a[], int b[], int sum[]) { for(int i=0; i<N-1; i++) { int m = sum[i]+a[i]+b[i]; sum[i] = m%10; sum[i+1] += m/10; } } void Sub(int a[], int b[], int c[]) { for(int i=0; i<N; i++) { if(a[i]-b[i] < 0)///借位; { c[i] = a[i]+10-b[i]; a[i+1] -= 1; } else c[i] = a[i] - b[i]; } } void Mul(int a[], int b[], int c[]) { int m; for(int i=0; i<N; i++) { for(int j=0; i+j+1<N; j++) { m = a[i]*b[j]; m+=c[i+j]; c[i+j] = m%10; c[i+j+1] += m/10; } } } int main() { int T, t=1, i, f, a[N], b[N], c[N]; char s1[N], s2[N]; scanf("%d", &T); while(T--) { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); memset(c, 0, sizeof(c)); f =0; scanf("%s%s", s1,s2); int len1 = strlen(s1); int len2 = strlen(s2); /* if(len1<len2) { f=1; swap(s1, s2); } else { if(strcmp(s1, s2)<0) f=1, swap(s1, s2); }*////在减法中要用到这个; change(s1, a); change(s2, b); /// Add(a, b, c);/// + /*Sub(a, b, c);/// - if(f == 1) printf("-"); */ Mul(a, b, c);/// * for(i=N-1; i>0; i--) { if(c[i]!=0) break; } printf("Case %d:\n", t++); printf("%s * %s = ", s1, s2); for(int j=i; j>=0; j--) printf("%d", c[j]); printf("\n"); if(T!=0) printf("\n"); } return 0; }
时间: 2024-12-22 06:11:52