【CSP-J 2022 入门】乘方(pow)题解

       今天我刷题的时候刷到了【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语句,就通过了:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值