算法-同余原理
在计算n个数相加或者相乘再取余时,中间结果可能会溢出导致结果错误,这时可以使用同余原理
一、同余原理
①加法同余
(a[1] + a[2] + ... + a[n])% m ==> (a[1] % m + a[2] % m + ... + a[n] % m) % m
② 乘法同余
(a[1] x a[2] x ... x a[n])% m ==> ((a[1] % m) x (a[2] % m) x ... x ( a[n] % m)) % m
二、代码测试
public class CoresidualTest {private static void testAdd() {System.out.println("==============加法同余===========");int[] arr = new int[10];for (int i = 0; i < 10; i++) {// 生成10个随机数for (int j = 0; j < 10; j++) {arr[j] = (int) (5555687 * Math.random());}// 计算(arr[0] + ... + arr[9]) % 56 == (arr[0] % 56 + arr[1] % 56 + ... + arr[9] % 56) % 56int ans1 = 0, ans2 = 0;for (int j = 0; j < 10; j++) {ans1 += arr[j];ans2 += arr[j] % 56;}System.out.println(ans1 % 56 == ans2 % 56);}}private static void testMultiply() {System.out.println("==============乘法同余===========");int[] arr = new int[10];for (int i = 0; i < 10; i++) {// 生成10个随机数for (int j = 0; j < 10; j++) {arr[j] = (int) (10 * Math.random());}// 计算(arr[0] * ... * arr[9]) % 56 == ((arr[0] % 56) * (arr[1] % 56) + ... * (arr[9] % 56)) % 56int ans1 = 1, ans2 = 1;for (int j = 0; j < 10; j++) {ans1 *= arr[j];ans2 *= arr[j] % 500;}System.out.println(ans1 % 10 == ans2 % 10);}}public static void main(String[] args) {// 测试加法同余testAdd();// 测试乘法同余testMultiply();}
}