A*B Problem
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
-
设计一个程序求出A*B,然后将其结果每一位相加得到C,如果C的位数大于等于2,继续将C的各位数相加,直到结果是个一位数k。
例如:
6*8=48;
4+8=12;
1+2=3;
输出3即可。
- 输入
- 第一行输入一个数N(0<N<=1000000),表示N组测试数据。
随后的N行每行给出两个非负整数m,n(0<=m,n<=10^12)。 - 输出
- 对于每一行数据,输出k。
- 样例输入
-
3 6 8 1234567 67 454 1232
- 样例输出
-
3 4 5
/* //代码一: 用cin cout TLE,改成scanf 948ms 降过 #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MAX = 15; int Mult(char *s1, char *s2) { int a[MAX], b[MAX], ans[MAX * 2]; int len1 = strlen(s1); int len2 = strlen(s2); memset(ans, 0, sizeof(ans)); for(int i = 0; i < len1; ++i) a[len1 - i - 1] = s1[i] - '0'; for(int i = 0; i < len2; ++i) b[len2 - i - 1] = s2[i] - '0'; for(int i = 0; i < len1; ++i) for(int j = 0; j< len2; ++j) ans[i + j] += a[i] * b[j]; int sum = 0; for(int i = 0; i < len1 + len2; ++i) { if(ans[i]>9) { ans[i+1] += ans[i] / 10; ans[i] %= 10; } sum += ans[i]; } return sum; } int main() { int T; char s1[MAX], s2[MAX]; // cin >> T; scanf("%d", &T); while(T--) { // cin >> s1 >> s2; scanf("%s%s", s1, s2); int sum = Mult(s1, s2); while(sum>9) { int t = sum; sum = 0; while(t) { sum += t % 10; t /= 10; } } //cout << sum << endl; printf("%d\n",sum); } return 0; } */ //代码二:-----最优代码 /* 分析:对于一个整数n,设f(n)为n的各个位之和,有这样一个等式 n%9=f(n)%9; 证明:同余定理(a+b)%c=(a%c+b%c)%c,还有显然成立和k*(10^M)%9=k,代入到n%9=f(n)%9中, 即可得证n%9=f(n)%9是成立的。 还要注意我们所求的是一个一位数,而我们是对9取余的,当余数为0时,我们要的结果可能是0,可能是9。是0的情况,只有开始时两个乘数至少有一个为0。其他情况为9。 题解:http://acm.nyist.net/JudgeOnline/articles/?p=696#more-696 */ #include <iostream> #include <cstdio> using namespace std; int main() { int n; long long a,b; scanf("%d",&n); while(n--) { scanf("%lld%lld",&a,&b); if(a==0 || b==0) printf("0\n"); else { int tp=(a%9)*(b%9)%9; if(tp==0) tp=9; printf("%d\n",tp); } } return 0; }