微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大数取余

整理一下自己遇到的两种大数取余类型的题目,如果遇到其他类型以后还会接着去补充。
一、A^B mod m
几个基本公式:

这里写图片描述


A < m,且B是一个较大的数,A^B非常巨大,先求A^B再用m取模是不现实的。利用上面公式,我们可以进行如下代换:

这里写图片描述


算法:

//计算exp=a^n mod m 
//输入:a,n,m
//输出exp
int exp_mod(int a,int n,int m)
{
    int exp,A; //exp表示a^n,A是A_i
    exp=1;
    A=a%m;
    while(n>0)
    {
        if(n%2 != 0)
            exp=(exp*A)%m;
        A=(A*A)%m;
        n=n/2;
    }
    return exp;
}

二、A%B
A是一个大数,B是一个int型的整数,求A%B。A可能无法用已知数据类型存储,直接取余很困难。
可以设置变量t从大数第一位向后遍历赋值,如果大于mod就取余更新,最后t的值就是所求答案。

例:
123 % 4 取一个中间变量t=0
1<4 t=1
— 2 t=1*10+2=12>4 t=t%4=0
— 3 t=0+3=3 t=t%4=3
——————– 余数 3

算法:

int MOD(string a,int mod)
{
    int len=a.length();
    int t=0;
    for( int i = 0; i < len; i++ )
    {
        t*=10;
        t+=a[i]-'0';
        if( t >= mod )
            t=t%mod;
    }
    return t;
}

参考博客http://www.cnblogs.com/lsx54321/archive/2012/07/25/2607602.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐