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取余

<span style="font-family:Microsoft YaHei;font-size:18px;">//不使用九余数定理
#include<stdio.h>

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;
}
</span>
//使用九余数定理
#include <stdio.h>

int main()
{
    int n,a,sum,i;
    while(scanf("%d",&n)&&n)
    {
        sum=1;
        for(i=0;i<n;i++)
        {
            sum=sum*n%9;
        }
        if(sum==0)
             printf("9\n");
        else
             printf("%d\n",sum);

    }
    return 0;
}
时间: 2024-08-03 16:28:14

HDU1163【九余数定理】【水题】的相关文章

HDU1163 Eddy&#39;s digital Roots【九余数定理】

Eddy's digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4436    Accepted Submission(s): 2505 Problem Description The digital root of a positive integer is found by summing the digi

Hdu-1163 Eddy&#39;s digital Roots(九余数定理)

题意:对于一个数,只要它不是单个数,就把它各位的数相加,直到成为单个数. 九余数定理 一个数对九取余后的结果称为九余数. 一个数的各位数字之和想加后得到的<10的数字称为这个数的九余数(如果相加结果大于9,则继续各位相加) 因为数据挺大的,不能暴力.所以可以边乘边取余.很像快速幂. 1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 5 int main(){ 6 int n; 7 while

2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题

听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到100即可 算最大GPA的时候,首先每个科目分配到60分,然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到85即可,如果还有REMAIN POINT,就FOR循环下来加到100上限即可 不会DP 阿 QAQ 过段时间得好好看DP了  =  = 于是默默的把这题标记为<水题集> //

hdu 1163 Eddy&#39;s digital Roots(九余数定理)

hdu 1163 Eddy's digital Roots 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

TYVJ 公路乘车 完全背包(水题)

描述 Description 一个特别的单行街道在每公里处有一个汽车站.顾客根据他们乘坐汽车的公里使来付费.例如样例的第一行就是一个费用的单子. 没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<=100),它可以通过无限次的换车来完成旅程.最后要求费用最少. 输入格式 InputFormat 第一行十个整数分别表示行走1到10公里的费用(<=500).注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少.第二行一个整数n表示,旅客的总路程数. 输出格式 Ou

HDU1013_Digital Roots【大数】【水题】

Digital Roots Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 49834    Accepted Submission(s): 15544 Problem Description The digital root of a positive integer is found by summing the digits of

九余数定理

九余数定理概念: 首先看九余数,即一个数对9取余的得到的数(某数%9)称为九余数. 一个数的各个位数之和小于10的数称为这个数的九余数,(相加至小于10). 可以这么说一个数各个位数相加如果相加之后的结果小于10,那么这个结果就等于这个数模9(对9取余). 举个例子:比如215,各个位数相加值小于10:2+1+5=8<10,215%9=8,两者相等. 还有一个应用: 比如num=1000*a+100*b+10*c+d: 可以写成num=999*a+99*b+9*c+(a+b+c+d): 这样就意

2015南阳CCPC L - Huatuo&#39;s Medicine 水题

L - Huatuo's Medicine Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Huatuo was a famous doctor. He use identical bottles to carry the medicine. There are different types of medicine. Huatuo put medicines into the bottles and chain these b

sdut 2841 Bit Problem (水题)

题目 贴这个题是因为看题解有更简单的方法, 我做的时候是直接算的, 也很简单. 贴一下题解吧: 如果一个整数不等于 0,那么该整数的二进制表示中至少有一位是 1. 这个题结果可以直接输出 x - (x&(x-1)); 因为x-1 之后二进制下,就是最右边的1变成了0, 最右边的1的 右边所有的0变成了1, 不影响最左边. 我的代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4