设 a = k1 * m + r1,b = k2 * m + r2
则 (a + b) % m = ((k1 * m + r1) + (k2 * m + r2)) % m
= ((k1 + k2) * m + (r1 + r2)) % m
= (r1 + r2) % m
= (a % m + b % m) % m
所以 (a + b) % m = (a % m + b % m) % m
(a * b) % m = ((a % m) * (b % m)) % m
设 a = k1 * m + r1,b = k2 * m + r2
则 (a * b) % m = ((k1 * m + r1) * (k2 * m + r2)) % m
= (k1 * k2 * m^2 + (k1 * r2 + k2 * r1) * m + r1 * r2) % m
= (r1 * r2) % m
= ((a % m) * (b % m)) % m
所以 (a * b) % m = ((a % m) * (b % m)) % m
大数的高精度对单精度取模
大数在编程中表示超过32位二进制位的数,不能直接求模,只能对其“分块”求模
应用公式(a + b) % m = (a % m + b % m) % m可做到边运算边取余
一个高精度数对一个数取余,可以把高精度数看成各位数的权值与个位数乘积的和。
比如1234 = ((1 * 10 + 2) * 10 + 3) * 10 + 4,对这个数进行取余运算就是上面基本加和乘的应用每步求模得1234%n = ((((1 * 10)%n+2%n)%n * 10%n+3%n)%n * 10%n+4%n)%n 代码实现#include//大数求余,其中n为除数 ,数组a[]用于存大数char a[1000];intmain()int i,j,k,m,n;{while(scanf("%s%d",a ,&n)!=EOF){
m=0;for(i=0; a[i]!='