NYOJ 105 九的余数【数学】

来源:互联网 发布:打车软件分析报告 编辑:程序博客网 时间:2024/05/17 03:14

九的余数

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

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

输入
第一行有一个整数m(1<=m<=8),表示有m组测试数据;
随后m行每行有一个自然数n。
输出
输出n整除九之后的余数,每次输出占一行。
样例输入
345465456541
样例输出
454
来源
[苗栋栋]原创

同余模定理

公式: (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 + 10char 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;}

0 0
原创粉丝点击