今天我刷题的时候刷到了【CSP-J 2022 入门】乘方(pow)这一题。那好,现在我们来解这道题!
题目描述:
小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数 a 和 b,求 ab 的值是多少。
ab 即 b 个 a 相乘的值,例如 23 即为 3 个 2 相乘,结果为 2×2×2=8。
“简单!”小文心想,同时很快就写出了一份程序,可是测试时却出现了错误。
小文很快意识到,她的程序里的变量都是 int
类型的。在大多数机器上,int
类型能表示的最大数为 231−1,因此只要计算结果超过这个数,她的程序就会出现错误。
由于小文刚刚学会编程,她担心使用 int
计算会出现问题。因此她希望你在 ab 的值超过 109 时,输出一个 -1
进行警示,否则就输出正确的 ab 的值。
然而小文还是不知道怎么实现这份程序,因此她想请你帮忙。
输入描述:
输入共一行,两个正整数 a,b。
输出描述:
输出共一行,如果 ab 的值不超过 109,则输出 ab 的值,否则输出 -1
。
用例输入 1 :10 9
用例输出 1 :1000000000
用例输入 2 :23333 66666
用例输出 2 :-1
首先,我们要打开头文件:
#include <iostream>
#include <math.h>
#include <cstdio>
使用命名空间:
using namespace std;
接下来定义long long简称:
typedef long long ll;
设置变量初始化:
ll a = 0, b = 0;
主函数:
int main() {}
输入a, b:
scanf("%lld %lld", &a, &b);
判断一下a是否等于1,因为a个1相乘结果都是1:
if (a == 1) {
printf ( "1\n" );//输出1,因为a个1相乘结果都是1
return 0;
}
判断一下b是否等于1,因为b的1次方结果为a:
if (b == 1) {
printf( "%lld", a);//输出1,因为b的1次方结果为a
return 0;
}
接下来把大部分的可能性全部排除:
if (a > 31622) {
printf ( "-1\n" );//超限输出-1
return 0;
}
if (b > 29) {
printf ( "-1\n" );//超限输出-1
return 0;
}
接下来计算a和b的乘方:
ll c = a;
for (int i = 1; i <= b - 1; i ++) {
c *= a;
}
再次判断a和b的乘方是否超限:
if (c > 1000000000) {
printf ( "-1\n" );//超限输出-1
}
否则输出a和b的乘方:
else {
printf ( "%lld\n", c);//否则输出a和b的平方
}
返回0值:
return 0;
可第一次提交上去没输出任何结果,代码如下:
//【CSP-J 2022 入门】乘方(pow)C++
#include <iostream>
#include <cstdio>
#include <cmath>
typedef long long ll;//本题一定一定要开long long!!!
ll a = 0, b = 0;//设置初始化
int main () {
scanf ( "%lld %lld", &a, &b);//输入a,b
if (a == 1) {
printf ( "1\n" );//输出1,因为a个1相乘结果都是1
return 0;
}
if (b == 1) {
printf( "%lld", a);//输出1,因为b的1次方结果为a
return 0;
}
if (a > 31622) {
printf ( "-1\n" );//超限输出-1
return 0;
}
if (b > 29) {
printf ( "-1\n" );//超限输出-1
return 0;
}
ll c = a;
for (int i = 1; i <= b - 1; i ++) {
c *= a;
}
if (c > 1000000000) {
printf ( "-1\n" );//超限输出-1
}
else {
printf ( "%lld\n", c);//否则输出a和b的平方
}
return 0;
}
结果如下:
后面审了一下题,原来还有文件IO:
输入文件 | power.in |
输出文件 | power.out |
所以正确答案是这样:
//【CSP-J 2022 入门】乘方(pow)C++
#include <iostream>
#include <cmath>
typedef long long ll;//本题一定一定要开long long!!!
ll a = 0, b = 0;//设置初始化
int main () {
freopen ("power.in", "r", stdin);
freopen ("power.out", "w", stdout);
scanf ( "%lld %lld", &a, &b);//输入a,b
if (a == 1) {
printf ( "1\n" );//输出1,因为a个1相乘结果都是1
return 0;
}
if (b == 1) {
printf( "%lld", a);//输出1,因为b的1次方结果为a
return 0;
}
if (a > 31622) {
printf ( "-1\n" );//超限输出-1
return 0;
}
if (b > 29) {
printf ( "-1\n" );//超限输出-1
return 0;
}
ll c = a;
for (int i = 1; i <= b - 1; i ++) {
c *= a;
}
if (c > 1000000000) {
printf ( "-1\n" );//超限输出-1
}
else {
printf ( "%lld\n", c);//否则输出a和b的平方
}
return 0;
}
加上freopen语句,就通过了: