题意:http://acm.nyist.net/JudgeOnline/problem.php?pid=485
设计一个程序求出A*B,然后将其结果每一位相加得到C,如果C的位数大于等于2,继续将C的各位数相加,直到结果是个一位数k。
例如:
6*8=48;
4+8=12;
1+2=3;
输出3即可。
分析:对于一个整数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。
下面是代码:
01 | #include <iostream> |
02 | #include <cstdio> |
03 | using namespace std; |
04 |
05 | int main() |
06 | { |
07 | int n; |
08 | long long a,b; |
09 | scanf ( "%d" ,&n); |
10 | while (n--) |
11 | { |
12 | scanf ( "%lld%lld" ,&a,&b); |
13 | if (a==0 || b==0) |
14 | printf ( "0\n" ); |
15 | else |
16 | { |
17 | int tp=(a%9)*(b%9)%9; |
18 | if (tp==0)tp=9; |
19 | printf ( "%d\n" ,tp); |
20 | } |
21 | } |
22 | return 0; |
23 | } |
原文地址http://blog.himdd.com/?p=1995
不错,学习了。