且未

博客园 首页 新随笔 联系 订阅 管理

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;
}

 

posted on 2018-03-22 16:53  阿聊  阅读(118)  评论(0编辑  收藏  举报