A*B Problem

题目描述

设计一个程序求出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

即 结果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;

猜你喜欢

转载自blog.csdn.net/hanyue0102/article/details/81363626
ab