杭电oj人见人爱A^B

这篇博客探讨了在处理大整数幂运算时,由于`pow()`函数存在的局限性,可能导致的错误情况,并提出了两种解决方案:通过同余方程和快速幂取模算法。同余方程方法仅取最后三位进行运算,而快速幂取模算法利用分治策略优化计算效率,避免了`pow()`函数的潜在问题。代码示例展示了这两种方法的实现,适用于处理模运算下的大整数幂计算问题。
摘要由CSDN通过智能技术生成

杭电oj人见人爱A^B

最先想到的就是pow()函数,但是在测试过程中发现pow()函数对输入的数据有诸多限制,可能导致错误的情况:
1.如果底数 x 为负数并且指数 y 不是整数,将会导致 domain error 错误。
2.如果底数 x 和指数 y 都是 0,可能会导致 domain error 错误,也可能没有;这跟库的实现有关。
3.如果底数 x 是 0,指数 y 是负数,可能会导致 domain error 或 pole error 错误,也可能没有;这跟库的实现有关。
4.如果返回值 ret 太大或者太小,将会导致 range error 错误。

解决方案:同余方程&快速幂取模算法
同余方程:
因要求输出最后三位数字,故在运算时,只取最后三位数字进行运算。

#include<iostream>
using namespace std;
int main()
{
    int m,n,r;
    while(cin>>m>>n&&(n||m))
    {
        r=1;
        m%=1000;       
        for(int i=1;i<=n;i++)
            r=r*m%1000;     
        cout<<r<<endl;
    }
    return 0;
}

快速幂取模算法:
1.模运算与乘法的性质

乘积取模可以在乘之前先取模

x * y % d = ((x % d) * (y % d)) % d;

比如:a*a%c = ((a % c) * ( a % c)) % c;

2.本题公式

当b为偶数时:ab mod c = ((a2)b/2) mod c
当b为奇数时:ab mod c = ((a2)b/2× a) mod c

因此快速幂实际是分治算法,每次将b分一半,直到b=0;):

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<iomanip>
#include<algorithm>
using namespace std;
typedef long long ll;
ll quick_mod(ll m,ll n,ll k)
{
	if(n==0) return 1;
	if(n%2==1)
	return m*quick_mod(m,n-1,k)%k;
	else
	{
		ll num=quick_mod(m,n/2,k);
		return num*num%k;
	}
}
int main() 
{
	ll a,b,c;
	c=1000;
	while(cin>>a>>b)
	{
		ll base=quick_mod(a,b,c);
		cout<<base<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值