hdu1163-Eddy's digital Roots

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

这道题目本来没有看到 n ^ n ,所以直接写,TLE了,但是突发奇想,能不能在n 累乘的过程中,直接求出各位数值和,在继续乘以 n ,直到 乘了n次;但是没有搞懂原理,后来问了dogdog,才知道了原理;

假设 前两位大于10 相乘为ab(因为有一项满足,其余的肯定也能通过同一个原理证明出来);利用数值表示就为 10 * a + b  ;

现在有( 1 0 * a  + b  ) * ( 10 * a + b )   ==100 * a * a  + 20 * a  * b + b * b ,在这里因为我们求得是他各位数值和,因此只需要a * a  +  2 *  a   *  b + b * b ;同样累积到最后一项,仍然只需要考虑 a b 即可;所以这种原理可以;

另外还可以利用二分法,从两边同时进行,可以效率 , 因为两边都是对称(因为都是n * n * .......* n * n ;

#include<iostream>
#include<cstdio>

using namespace std; 
#define INT __int64
int Sum( INT n )
{
	INT sum = 0 ;
	while( n )
	{
		sum += n % 10 ;
		n /= 10 ;
	}
	return sum ;
}

int main()
{
	INT n , sum ;
	INT i , j , k ;
	while( scanf( "%I64d" , &n ) != EOF && n )
	{
		INT tempn = 1 ;
		INT b = n ;
		while( b-- )
		{
			tempn *= n ;
			tempn = Sum( tempn ) ;
		}
		sum = Sum( tempn ) ;
		while( sum > 9 )
			sum = Sum( sum ) ;
		printf( "%I64d\n" ,sum ) ;
	}
	return 0 ;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值