解:
2023-10-20 19:48:36
发布于:上海
4阅读
0回复
0点赞
主体思路:在计算ab时同时判断当前所得数是否超过109,超过后输出-1并返回,若程序成功退出循环,则说明所得答案没有越界,输出所得数即可。
AC代码:
#include <iostream>
using namespace std;
int a,b; // 记录题目中所给整数a,b 不会超过2^31-1
long long c=1; // 记录当时计算得到的数值,可能超过2^31-1
int main(){
cin >> a >> b; // 输入a,b
for(int i=0;i<b;i++){ // 根据幂的意义,将乘方运算(a^b)拆分为乘法运算(b个a相乘)
c *= a; // 进行一次乘法运算
if(c>1000000000){ // 可写为10e9,判断当前值是否超过10^9
cout << -1 << endl; // 输出-1表示超过10^9
return 0; // 退出程序
}
}
cout << c << endl; // 在for循环中没有退出程序,说明答案c不大于10^9,输出即可
return 0; // 退出程序
}
在实际实现时,会出现一种错误代码如下:
......
for(int i=0;i<b;i++){ // 根据幂的意义,将乘方运算(a^b)拆分为乘法运算(b个a相乘)
c *= a; // 进行一次乘法运算
}
if(c>1000000000) cout << -1 << endl; // 输出-1表示超过10^9
else cout << c << endl; // 在for循环中没有退出程序,说明答案c不大于10^9,输出即可
return 0; // 退出程序
此时程序会WA3个点,因为ab可能大于263-1,也就是超过long long类型上限
将c改为unsigned long long
可解决1个点
更优方式为将判断改至循环中,每乘一次a判断一次,可以通过本题全部检测点
这里空空如也
有帮助,赞一个