您的位置:首页 > 其它

NYOJ 105 九的余数【数学】

2014-07-25 01:20 281 查看


九的余数

时间限制:3000 ms | 内存限制:65535 KB
难度:3

描述

现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数整除九之后的余数。

输入
第一行有一个整数m(1<=m<=8),表示有m组测试数据;

随后m行每行有一个自然数n。

输出
输出n整除九之后的余数,每次输出占一行。
样例输入
3
4
5
465456541


样例输出
4
5
4


来源
[苗栋栋]原创

同余模定理



公式: (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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: