①淮安民間傳說着一則故事——「韓信點兵」,其次有成語「韓信點兵,多多益善」。優化
②在一千多年前的《孫子算經》中,有這樣一道算術題:「今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二,問物幾何?」按照今天的話來講:一個數除以3餘2,除以5餘3,除以7餘2,求這個數。這樣的問題,也有人稱爲「韓信點兵」。它造成了一類問題,也就是初等數論中的解同餘式。spa
③問題:一個數除以3餘2,除以5餘3,除以7餘2,求符合條件的最小數。code
直接從0一直計算到很大的數值來進行判斷blog
public static int dealSingle1(int index0,int index1,int index2){//暴力求解 boolean a,b,c; for(int i=0;i<Integer.MAX_VALUE;i++){ a=(i%3==index0); b=(i%5==index1); c=(i%7==index2); if(a&&b&&c){ return i; } } return -1; }
先列出除以3餘2的數:2,5,8,11,14,17,20,23,26……get
public static int dealSingle2(int index0,int index1,int index2) {//2,數學方法求解 long startTime = System.currentTimeMillis(); int num=0,num1=0; for(int i=0;i<Integer.MAX_VALUE;i++){ num=5*i+index1;//修改優化,直接使用較大大數進行取值,進一步加快速度 if(num%3==index0){ break; } } for(int i=0;i<Integer.MAX_VALUE/15;i++){ num1=num+15*i; if(num1%7==index2){ long endTime = System.currentTimeMillis(); System.out.println("方法2:數學優化,耗時:"+(endTime-startTime)); return num1; } } return -1; }
public static int dealSingle3(int index0,int index1,int index2){//處理單個數據 long startTime = System.currentTimeMillis(); int num=-1; boolean a,b; for(int i=0;i<Integer.MAX_VALUE/7;i++){ num=i*7+index2; a=(num%3==index0); b=(num%5==index1); if(a&&b){ long endTime = System.currentTimeMillis(); System.out.println("方法3:數學優化,耗時:"+(endTime-startTime)); return num; } } return num; }
計算出韓信點兵的全部結果【3,5,7所有爲素數,那麼在0~(3*5*7-1)這個範圍內的全部數據都是其中的一種狀況】數學
public static int[][][] dealAll(){//每次只計算一次,直到全部數據 int[][][] arr=new int[3][5][7]; for(int i=0;i<(3*5*7);i++){ arr[i%3][i%5][i%7]=i; } return arr; }