您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页快速幂算法(c语言)

快速幂算法(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;
}

如果可以,点个赞吧

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务