大整数取模的一点理解

来源:互联网 发布:linux jdk tar.gz下载 编辑:程序博客网 时间:2024/05/16 17:23

大整数取模的基本原理就是基于x无论乘上10的至少1次方,最终得出的模的结果都一样(这个卡了我好久。。。。)

 测试:

#include <cstdio>#include <cstring>char a[10000 + 10];int main(){    int l, len;//    while(~scanf("%s%d", a, &b)){//        len = strlen(a);//        int ans = 0;//        for(int i = 0; i < len; i++)//        {//             ans = (int)(((long long) ans*10 + a[i] - '0') % b);//             printf ("%d ", ans);//        }//            //long long保存中间结果//        printf("%d\n", ans);//    }//    return 0;    scanf("%d%d",&l,&len);    printf("%d%d%d%d",(l*10)%len,(l*100)%len,(l*1000)%len,(l*10000)%len);}


1.取模的常用公式:

一 . (a+b)mod n = ((a mod n)+(b mod n) mod n

二 . (a-b)mod n = ((a mod n)-(b mod n)+n) mod n

三 . ab mod n = (a mod n)(b mod n) mod n

比如,求两个整数的乘积的模,因为乘积可能超过INT_MAX, 故应该用long long存储中间值。

int mul_mod(int a, int b, int n){    a %= n;    b %= n;    return (int) ((long long)a*b % n);}

2.应用:大整数取模

思路:首先,将大整数分解成这种形式:1234 = ((1*10+2)*10+3)*10+4

不难发现,这种形式可以应用我们前面的取模公式,分步取模。

取模代码:

#include <cstdio>#include <cstring>char a[10000 + 10];int main(){    int l, len;    while(~scanf("%s%d", a, &b)){        len = strlen(a);        int ans = 0;        for(int i = 0; i < len; i++)        {             ans = (int)(((long long) ans*10 + a[i] - '0') % b);             printf ("%d ", ans);        }            //long long保存中间结果        printf("%d\n", ans);    }    return 0;//    scanf("%d%d",&l,&len);//    printf("%d%d%d%d",(l*10)%len,(l*100)%len,(l*1000)%len,(l*10000)%len);}



0 0
原创粉丝点击