信息学奥赛一本通 2086:【22CSPJ普及组】乘方(pow) | 洛谷 P8813 [CSP-J 2022] 乘方

【题目链接】

ybt 2086:【22CSPJ普及组】乘方(pow)
洛谷 P8813 [CSP-J 2022] 乘方

【题目考点】

1. 求数字位数
2. 循环 累乘

【解题思路】

解法1:循环求幂

a与b的范围都是 1 ∼ 1 0 9 1\sim 10^9 1109,结果超过 1 0 9 10^9 109就输出-1。
两个小于等于 1 0 9 10^9 109的数字相乘,结果不会超过 1 0 18 10^{18} 1018,可以使用long long类型保存该值。
这里使用循环求幂。
注意:a=1,b= 1 0 9 10^9 109时,循环求幂会循环 1 0 9 10^9 109次,大于 1 0 8 10^8 108,会超时。因此当a=1时,应该直接输出1。
设r为累乘乘积,初值为1。如果在循环求幂的过程中,若发现r大于 1 0 9 10^9 109,则直接输出-1,而后结束程序。
最后输出乘积r。
复杂度为: O ( b ) O(b) O(b)

【题解代码】

解法1:循环求幂
#include 
using namespace std;
#define N 105
int main()
{
	long long r = 1;
	int a, b;
	cin >> a >> b;
	if(a == 1)
	{
		cout << 1;
		return 0;
	}
	for(int i = 1; i <= b; ++i)
	{
		r *= a;
		if(r > 1000000000)
		{
			cout << -1;
			return 0;
		}
	}
	cout << r;
	return 0;
}

你可能感兴趣的:(NOIP真题解答,信息学奥赛一本通题解,洛谷题解,CSP真题)