废话不少说来。
思路
给定两个正整数 a、b,求 a 的 b 次方。如果计算结果超过规定上限就输出 - 1,没有超过就输出乘方结果。
核心思路:循环累乘,在每次相乘之前先判断继续相乘会不会超出上限。如果直接相乘会超限,就标记结果为 - 1 并退出循环,避免数字溢出
写法 1
引入万能头文件,使用 std 命名空间。主函数读入 a 和 b。定义 long long 类型变量 ans 初始值为 1。循环执行 b 次,每次循环判断,如果 ans 大于上限除以 a,代表再乘 a 就超出范围,ans 赋值为 - 1,跳出循环;否则 ans = ans * a。循环结束输出 ans。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
long long ans=1;
for(int i=1;i<=b;i++)
{
if(ans > 1000000000 / a)
{
ans = -1;
break;
}
ans = a;
}
cout<<ans;
return 0;
}
写法 2
引入万能头文件,使用 std 命名空间。主函数读入 a,b,long long res=1,bool flag=true。循环 b 次,如果 res > 1000000000/a,flag=false,break;res=resa。循环结束,如果 flag 为真输出 res,否则输出 - 1。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
long long res=1;
bool flag = true;
for(int i=1;i<=b;i++)
{
if(res > 1000000000 / a)
{
flag = false;
break;
}
res = a;
}
if(flag) cout<<res;
else cout<<-1;
return 0;
}
要点提醒:
要用long long存结果,防止中间计算溢出。
判断超限不能写成resa>1e9,因为 res*a 会先计算,直接溢出出错。要用除法判断 res > 1000000000/a。
一旦发现会超限,立刻停止循环,输出 - 1
总之来说,题目有时候简单,有时候变化多端。