【题目链接】
ybt 2086:【22CSPJ普及组】乘方(pow)
洛谷 P8813 [CSP-J 2022] 乘方
【题目考点】
1. 求数字位数
2. 循环 累乘
【解题思路】
解法1:循环求幂
a与b的范围都是
1
∼
1
0
9
1\sim 10^9
1∼109,结果超过
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 <bits/stdc++.h>
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;
}