NYOJ 105 九的余数【数学】

九的余数

时间限制: 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值