HRBUST-1140 数字和问题

问题描述: 定义一种操作为:已知一个数字,对其各位数字反复求和,直到剩下的数是一位数不能求和为止。
例如:数字2345,第一次求和得到2 + 3 + 4 + 5 = 14,再对14的各位数字求和得到1 + 4 = 5,得到5将不再求和。
现在请你求出对ab进行该操作后,最终得到的数字是什么。

输入:
对于每组数据:
第一行,包含两个数字a(0 <= a <= 2000000000)和b(1 <= b <= 2000000000)

输出:
对于每组数据:
第一行,输出对ab进行操作后得到的数字是什么

看到这道题的数据规模,常规做法显然是不行的。首先需要知道两点:
1.一个数字对9取模等于该数字各个位相加对9取模
2.如此大的数据规模,显然要采取快速幂运算,快速幂这里详细讲解了快速幂运算的原理,以及一步步的优化

知道这两点后,这道题也就很容易了。
只有两点需要注意:
1.底数为0的输出,最终输出为0
2.因为是对9取模的,所以如果最终结果为0,应转化为9

下边是代码:

#include <iostream>
using namespace std;

// 一个数字对9取模==该数字各个位相加对9取模 

int quickPower(long long base,long long power)//快速幂 
{
    
    
	int ans=1;
	while(power>0)
	{
    
    
		if(power%2==1)
			ans=ans*base%9;
		base=(base*base)%9;
		power=power/2;
	}
	return ans;
}

int main()
{
    
    
	int a,b;
	while(cin>>a>>b)
	{
    
    
		int res=quickPower(a,b)%9;
		if(a==0) res=0;
		else if(res==0) res=9;
		cout<<res<<endl;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45102820/article/details/112907828
今日推荐