大整数取模的一点理解
来源:互联网 发布: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
- 大整数取模的一点理解
- 大整数取模
- 大整数取模
- 大整数取模
- 大整数取模
- 大整数取模
- 大整数取模
- 大整数取模
- 大整数取模
- 大整数的加减乘除取模
- 数论--大整数取模
- Big Number(大整数取模)
- NYOJ 1077 【博弈+大整数取模】
- Large Division(大整数取模)
- 大整数除法(取模和取余)
- POJ 1426 好玩的打表题(bfs+大整数取模)
- PHP中大整数取余返回负数的问题
- 从大量整数中选取最小/大的若干个
- 值传递与引用传递的区别?
- Linux Page cache和Block I/O layer
- 实际快速排序 -分割策略
- 486. Predict the Winner
- MySQL架构由小变大的演变过程
- 大整数取模的一点理解
- woowj
- Codeforces 777E 贪心
- Spring学习及整合遇到的问题(二)
- 开发一个好项目:九、android奔溃日记记录系统
- 解析Java的多线程机制
- sklearn CountVectorizer按指定字符切分字符串
- 2017.02.25:算法02(广搜)
- Android 框架Dileber :四、SelectDialog的使用