2022CSP-J组真题 1.乘方

101 阅读1分钟

线上OJ:

www.luogu.com.cn/problem/P88…

核心思想:

1、对 a=1 和 b=1 进行特判
2、为了防止超过1e9, 故采用两遍同除一个 a 的方法

题解代码:

解法一、两边同除a

#include <bits/stdc++.h>
using namespace std;
int a, b;  //定义a和b
int main()
{
    cin >> a >> b;  //输入a和b
    if (a==1) 
	{  //对a=1进行特判
        cout << 1 << endl;  //如果a=1,无论多少次乘方,结果仍然为1
        return 0;  //退出程序
    }
    if (b==1) 
	{  //对b=1进行特判
        cout << a << endl;  //如果b=1,无论多少次乘方,结果为a
        return 0;  //退出程序
    }
    int ans = 1;  //定义ans
    for (int i=1; i<=b; i++) 
	{  //循环b次
        if (ans > 1e9 / a) 
		{  //不等式移向判断,解决等式两边超过1e9的情况
            ans = -1;  //如果输出结果超过10^9,结果为-1
            break;  //退出循环
        }
        else ans *= a;  //否则计算得到结果
    }
    cout << ans << endl;  //输出a^b的值
    return 0;
}

解法二、死算也能混满分

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
int a, b;  //定义a和b
int main()
{
    cin >> a >> b;  //输入a和b
    if (a==1) 
	{  //对a=1进行特判
        cout << 1 << endl;  //如果a=1,无论多少次乘方,结果仍然为1
        return 0;  //退出程序
    }
    if (b==1) 
	{  //对b=1进行特判
        cout << a << endl;  //如果b=1,无论多少次乘方,结果为a
        return 0;  //退出程序
    }
    ll ans = 1;  //定义ans
    for (int i=1; i<=b; i++) 
	{  //循环b
		ans *= a;
        if (ans > 1e9) 
		{  
            ans = -1;  	//如果输出结果超过10^9,结果为-1
            break;  	//退出循环
        }
    }
    cout << ans << endl;  //输出a^b的值
    return 0;
}