SGU118 Digital root
题目大意:
设 f(n) 表示十进制正整数 n 的各位数字之和。如果 f(n) 是一个1位数那么他就是 n 的数根。否则的话 f(n) 的数根就是 n 的数根。举例说明:987的数根是 6(9+8+7=24 2+4=6)。你的任务是算出这样的数的数根: A1*A2*…*AN + A1*A2*…*AN-1 + … + A1*A2 + A1。
输入
输入包含K个测试点。在第一行会给出 K (1<=K<=5)。每个测试点一行。首先是一个正整数N (N<=1000)。 接着N个非负整数 (序列 A)。 均不超过10^9。
输出
每个测试点一行,输出给定数的数根。
样例输入
1 3 2 3 4
样例输出
5
不知道结论的话爆搞还是有点复杂的(而且说不定就过不了)
结论:一个数与它的数字和在mod9的结果上相同
证明:对于任意第k位数字Ak(设个位为第一位),有:
10^(k-1) mod 9=1;
所以:(10^(k-1) mod 9)*Ak=Ak;
又因为0<=Ak<=9
所以(10^(k-1)*Ak mod 9)=Ak
所以任意一位数字都满足,加起来不就满足啦!
知道这个结论就水题一道了。
注意:当答案为0的时候输出9(原因自行脑补)
下面附上我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int a,sum,k,n;
void init()
{
int i,x;
scanf("%d",&k);
while (k--)
{
scanf("%d",&n);
sum=0; a=1;
for (i=1;i<=n;i++)
{
scanf("%d",&x);
a=(a*(x%9))%9;
sum=(sum+a)%9;
}
if (sum)
printf("%d\n",sum);
else
printf("9\n");
}
return ;
}
int main()
{
init();
return 0;
}