题目描述
设计一个程序求出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
题解:
在那道题(点击查看)中就总结了一个规律,就是:一个大数对9取余等于这个数各位数字之和对9取余。现在根据这个题目的意思,是反过来了。题目中说,这个数的各个位的数字之和一直处理到个位数。 我们经过演算可以得知计算“一个数W=mn的这样的运算”的结果可以用(W-1)%9+1直接得到。
而 mn-1 = (m-1 +1)(n-1 +1)-1 = (m-1)(n-1)+(m-1) + (n-1)+1 - 1 = (m-1)(n-1)+(m-1) + (n-1)
所以(mn-1)%9 = [(m-1)(n-1)+(m-1) + (n-1) ]%9 = [(m-1)(n-1)%9+(m-1)%9 + (n-1)%9]%9= { [(m-1)%9+1] * [(n-1)%9+1] -1 }%9
扫描二维码关注公众号,回复:
2538181 查看本文章
即 结果A= (mn-1)%9 +1 = { [(m-1)%9+1] * [(n-1)%9+1] -1 }%9 +1
这样就把m和n的位数降下来了,可以直接输入m、n然后对9取模; 如果遇到了long long 存不下的数,可以运用
代码:
#include<stdio.h>
int main()
{
long long N,n,m;
scanf("%lld",&N);
while(N--)
{
scanf("%lld %lld",&m,&n);
long long t=((m-1)%9+1)*((n-1)%9+1);
long long te=(t-1)%9+1;
printf("%lld\n",te);
}
return 0;
}
核心代码:
long long t=((m-1)%9+1)*((n-1)%9+1);
long long te=(t-1)%9+1;