hdu 1163 Eddy's digital Roots 【九余数定理】

http://acm.hdu.edu.cn/showproblem.php?pid=1163

九余数定理:

如果一个数的各个数位上的数字之和能被9整除,那么这个数能被9整除;如果一个数各个数位上的数字之和被9除余数是几,那么这个数被9除的余数也一定是几。

 

证明:

首先10^i =99...9(i个9) +1除以9的余数=1

所以ai*10^i除以9的余数=ai

 

用a0~an表示各位数字则
数=(anan-1an-2.a2a1a0),
 =an*10^n+an-1*10^n-1 +an-2 *10^n-2 +.a2*10^2+a1*10+a0

 

除以9的余数=an +an-1 +an-2 +.+a2 +a1 +a0

 

 例如,3645732这个数,各个数位上的数字之和为  3+6+4+5+7+3+2=30,  30被9除余3,所以3645732这个数不能被9整除,且被9除后余数为3。

题目大意:将一个数n的各位数字加起来,如果得到的是一个一位数,那么这个数就叫n的数根,如果是两位数或多位数,则重复这个过程,直到得到的数字是一位数。现在给出n,求n^n(这里是n的n次方,总是想当然的以为是n的平方)的数根。

题目解析:最终的答案是小于10的,相当于各位数的和模10,可以不转化为对9取模,当余数为0时,则相当于模10余9。这样,便转化为了求各位数的和模9。这样便能运用九余数定理了。九余数定理的内容是这样的,一个数的各位之和除以9的余数等于这个数除以9的余数。

上面说:便转换为了求各个位数的和模9,但是我并没有再代码中感觉到有这个思想。

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int n,temp;
	while(~scanf("%d",&n),n)
	{
		temp = n;
		for(int i=2;i<=n;i++)
			temp = temp * n % 9;
		if(temp == 0)
			printf("9\n");
		else
			printf("%d\n",temp);
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值