天天看点

【HDU】1163 Eddy's digital Roots

问题描述 通过总和整数的数字找到正整数的数字根。如果结果值是单个数字,那么该数字就是数字根。如果结果值包含两个或更多数字,则将这些数字相加并重复该过程。只要有必要获得一个数字,就会继续这样做。

例如,考虑正整数24.将2和4相加产生6的值。由于6是单个数字,因此6是24的数字根。现在考虑正整数39.将3和9相加12.由于12不是单个数字,因此必须重复该过程。添加1和2 yeilds 3,一个数字,也是39的数字根。

埃迪的一个简单的问题是:给你n,希望你找到n ^ n的数字Roots。   输入 输入文件将包含一个正整数列表n,每行一个。输入的结尾将用整数值0表示。注意:对于输入n(n <10000)中的每个整数。   输出 在输出的一个单独的行上输出n ^ n的数字根。 示例输入

2 4 0

示例输出

4 4

    这道题与之前的【1013】都是求数根,但是这两道题的解法是不同的。1013的特点是输入的数位数特别多,每一位相加循环求数根;而1163则是要求输入n的n次幂再求数根。

    在这里,我用的是上学期初等数论证明过的一个练习题的结论(网上叫九余数定理)

    简单来讲,就是说一个数模9的余数不等于0,那么这个余数就是这个数的数根;等于0,数根就是9。(这个结论是很容易证明的)

下面来看代码:

//九余数定理
#include <stdio.h>

int main() {
    int temp; //定义临时变量
    int n,i;
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        temp=n;
        for (i=0; i<n-1; i++)
        {
            temp=(temp*n)%9;
        }                  //计算n^n,取余
        if(temp==0)
            printf("9\n");
        else
            printf("%d\n",temp);
    }
    return 0;
}
           

继续阅读