快速幂

SDNU OJ 1349 快速幂入门

Description
输入3个数a,b,c,求a^b mod c=?
Input
多组数据:每组数据,三个数a,b,c。
Output
对于每一组数据,输出一个数,即a^b mod c 的答案。
Sample Input

5 10 9

1.用递归实现

# include <cstdio>
# include <iostream>
using namespace std;
long long FastM(long long a, long long p, long long m)
{
    long long tmp,ans;
    a%=m;
    if(p == 1)//是1次方,直接返回
    {
        return a;
    }
    else if(p == 0)//0次方,返回1%m
    {
        return 1 % m;
    }
    tmp=FastM(a, p/2, m); //计算a^(p/2)%m;
    ans=tmp * tmp % m;//a^p=a^(p/2)*a^(p/2)
    if(p % 2 == 1) //如果p是奇数,再乘上a
    {
        ans = ans * a % m;
    }
    return ans;
}
int main ()
{
    long long a,b,c;
    while (cin >> a >> b >> c)
    {
        printf ("%lld\n",FastM(a,b,c));
    }

    return 0;
}

2.用循环来实现:

#include<cstdio>
long long mod(long long a,long long b,long long k)
{
    long long ans=1;
    a = a % k;
    while(b>0)
    {
        if(b % 2 == 1)
            ans=(ans * a) % k;//如果是奇数就要多求一步可以提前算在ans里
        b /= 2;
        a = (a * a) % k;
    }
    return ans;
}
int main()
{
    long long A,B,K;
    while(scanf("%lld%lld%lld",&A,&B,&K) != EOF)
    {
        printf("%lld\n",mod(A,B,K));
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值