信息学奥赛一本通 2086:【22CSPJ普及组】乘方(pow) | 洛谷 P8813 [CSP-J 2022] 乘方

本文介绍了如何使用循环求幂的方法解决洛谷P8813/CSP-J2022题目中的乘方计算问题,关注点在于处理大数乘法和避免溢出。当a=1时,优化了算法以减少循环次数,避免超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目链接】

ybt 2086:【22CSPJ普及组】乘方(pow)
洛谷 P8813 [CSP-J 2022] 乘方

【题目考点】

1. 求数字位数
2. 循环 累乘

【解题思路】

解法1:循环求幂

a与b的范围都是 1 ∼ 1 0 9 1\sim 10^9 1109,结果超过 1 0 9 10^9 109就输出-1。
两个小于等于 1 0 9 10^9 109的数字相乘,结果不会超过 1 0 18 10^{18} 1018,可以使用long long类型保存该值。
这里使用循环求幂。
注意:a=1,b= 1 0 9 10^9 109时,循环求幂会循环 1 0 9 10^9 109次,大于 1 0 8 10^8 108,会超时。因此当a=1时,应该直接输出1。
设r为累乘乘积,初值为1。如果在循环求幂的过程中,若发现r大于 1 0 9 10^9 109,则直接输出-1,而后结束程序。
最后输出乘积r。
复杂度为: O ( b ) O(b) O(b)

【题解代码】

解法1:循环求幂
#include <bits/stdc++.h>
using namespace std;
#define N 105
int main()
{
	long long r = 1;
	int a, b;
	cin >> a >> b;
	if(a == 1)
	{
		cout << 1;
		return 0;
	}
	for(int i = 1; i <= b; ++i)
	{
		r *= a;
		if(r > 1000000000)
		{
			cout << -1;
			return 0;
		}
	}
	cout << r;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值