九的余数
-
描述
-
现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数整除九之后的余数。
-
输入
-
第一行有一个整数m(1<=m<=8),表示有m组测试数据;
随后m行每行有一个自然数n。
输出
- 输出n整除九之后的余数,每次输出占一行。 样例输入
-
3 4 5 465456541
样例输出
-
4 5 4
来源
- [苗栋栋]原创
-
第一行有一个整数m(1<=m<=8),表示有m组测试数据;
同余模定理
公式: (a*b)%c == ((a%c)*(b%c))%c
(a+b)%c == ((a%c)+(b%c))%c
例如:求 5978%9的值
5987可化为 5978 = 5000 + 900 + 70 + 8
运用公式 : 5978%9=((5000%9) + (900%9) + (70%9) + (8%9)) %9
5000%9 = ((5%9) * (1000%9))%9
而 (1000%9) = ((10%9) * (10%9)*(10%9))%9 , 10%9==1
所以 5000%9 = ((5%9) * (1000%9))%9 =5%9=5
以此类推,可得每一位上的数相加 再对9取余
即 5978%9 = (5+9+8+7)%9 = 29 % 9 = 2
先运用公式2加法,在运用公式1乘法。
ps: 有人可能考虑到 900%9结果不是为0吗?是否要加上判断?
答案是不需要。因为加上9,对余数(结果)是没有影响的。
求一个数x对y余数,相当于求 x - (n*y) ,把y的倍数减去后剩余多少,即余数。
AC码
#include<stdio.h>
#define MAXN 1000000 + 10
char a[MAXN]={};
int main()
{
int m,i,sum,t;
scanf("%d",&m);
while(m--)
{
sum = 0;
scanf("%s",a);
for(i=0;a[i]!='\0';i++)
sum += a[i]-'0';
t = sum % 9;
printf("%d\n",t);
}
return 0;
}