HDU1163【九余数定理】【水题】

Eddy's digital Roots


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4632    Accepted Submission(s): 2578




Problem Description
The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit.


For example, consider the positive integer 24. Adding the 2 and the 4 yields a value of 6. Since 6 is a single digit, 6 is the digital root of 24. Now consider the positive integer 39. Adding the 3 and the 9 yields 12. Since 12 is not a single digit, the process must be repeated. Adding the 1 and the 2 yeilds 3, a single digit and also the digital root of 39.


The Eddy's easy problem is that : give you the n,want you to find the n^n's digital Roots.
 


Input
The input file will contain a list of positive integers n, one per line. The end of the input will be indicated by an integer value of zero. Notice:For each integer in the input n(n<10000).
 


Output
Output n^n's digital root on a separate line of the output.
 


Sample Input
2
4
0
 


Sample Output
4
4
 


Author

eddy

题目大意:给你一个正整数n,把n的各位上数字加起来,如果结果小于10,则所得结果为n的数字根,如果大于10,则再把上边所得结果各位上的数字加起来。现在给你一个数n,求n^n的数字根

思路:一看数据规模10000^10000,肯定要把n拆分掉。通过找规律发现,求n^n的数字根可转化为先求n的数

字根a,然后求a*n的原根,赋给a,接着依次求a*n,求n-1次,就得到了n^n的数字根。

例如:求5^5的数字

第一种方法:5^5 = 3125     3 + 1 + 2 + 5 = 11      1 + 1 = 2   最终结果是2

第二种方法:5的数字根是5   5*5*5*5*5 =  25*5*5*5   

   相当于25的数字根7 *5*5*5  = 35*5*5 = 8*5*5 = 40*5 = 4*5 = 20 = 2

   最终结果为2

对于第二种方法可以用九余数定理,更加简单。

九余数定理:一个数N各位数字的和,对9取余等于这个数对9取余

//不使用九余数定理
#include

int main()
{
    int n;
    while(~scanf("%d", &n) && n)
    {
        int a = n;
        int b = 0;
        while(a > 0)
        {
            b += a % 10;
            a /= 10;
        }
        if(b != 0)
            a = b;
        int x = a;
        for(int i = 1; i < n; i++)
        {
            a *= x;
            b = 0;
            while(a > 0)
            {
                b += a % 10;
                a /= 10;
            }
            if(b != 0)
                a = b;
        }
        b = 0;
        while(a > 0)
        {
            b += a % 10;
            a /= 10;
        }
        if(b != 0)
            a = b;
        printf("%d\n",a);
    }
    return 0;
}

//使用九余数定理
#include 

int main()
{
    int n,a,sum,i;
    while(scanf("%d",&n)&&n)
    {
        sum=1;
        for(i=0;i




        



你可能感兴趣的:(数论,-----,数,学,-----,ACM题解——梦想之路)