快速幂算法(c语言)

取模运算:a % p(或a mod p),表示a除以p的余数。

比如给定一个正整数p,任意一个整数n,一定存在等式 :n = kp + r ;其中 k、r 是整数,且 0 ≤ r < p,则称 k 为 n 除以 p 的商,r 为 n 除以 p 的余数。

取模运算的规则如下:

1、(a + b) % p = (a % p + b % p) % p

2、(a - b) % p = (a % p - b % p) % p

3、(a * b) % p = (a % p * b % p) % p

4、a ^ b % p = ((a % p)^b) % p

先来看看题目

T219307 【模板】快速幂||取余运算

 

算法

显然暴力是不合适的,因为数据太大

先提供代码

#include<stdio.h>
typedef long long ll;            //typedef 用来给数据类型换一个名字
ll PowerMode (ll a,ll b,ll mode);            //返回类型long long
int main()
{
    ll a,b,mode;
    scanf("%lld %lld %lld",&a,&b,&mode);
    printf("%lld^%lld mod %lld=%lld\n",a,b,mode,PowerMode(a,b,mode));
}

ll PowerMode (ll a,ll b,ll mode)
{
    ll sum=1;
    a%=mode;                    //第一步,先取余
    while(b)                    //指数为0循环停止
    {
        if(b%2==1)               //奇数时,先乘一个a
        {
            sum=(sum*a)%mode;
        }
        b/=2;                    //反正都要减半
        a=a*a%mode;               //a就要平方(再取余)
    }
    return sum;
}

思路推演

 

 

b&1  b为奇数时,b的二进制末尾为1,此时b和1的与运算为1;b为偶数时,b的二进制末尾为0,此时和1的与运算为0,这个适合用if判断b是否为奇数

#include<stdio.h>
typedef long long ll;            //typedef 用来给数据类型换一个名字
ll PowerMode (ll a,ll b,ll mode);            //返回类型long long
int main()
{
    ll a,b,mode;
    scanf("%lld %lld %lld",&a,&b,&mode);
    printf("%lld^%lld mod %lld=%lld\n",a,b,mode,PowerMode(a,b,mode));
}

ll PowerMode (ll a,ll b,ll mode)
{
    ll sum=1;
    a%=mode;                    //第一步,先取余
    while(b)                    //指数为0循环停止
    {
        if(b&1)               //b为奇数
        {
            sum=(sum*a)%mode;
        }
        b/=2;                    //反正都要减半
        a=a*a%mode;               //a就要平方(再取余)
    }
    return sum;
}

如果可以,点个赞吧

  • 23
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值