大数取余

整理一下自己遇到的两种大数取余类型的题目,如果遇到其他类型以后还会接着去补充。
一、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

相关文章

自1998年我国取消了福利分房的政策后,房地产市场迅速开展蓬...
文章目录获取数据查看数据结构获取数据下载数据可以直接通过...
网上商城系统MySql数据库设计
26个来源的气象数据获取代码
在进入21世纪以来,中国电信业告别了20世纪最后阶段的高速发...