1 << i ,是左移,1<< 1 等于2,1 << 2 等于4,其实只是为了快速求2的多少次方而已
publicclassFastMultiplication{publicstaticvoidmain(String[] args){int i =newFastMultiplication().fastMultiplication(4,4);System.out.println(i);}publicintfastMultiplication(int a,int b){if(a ==0|| b ==0)return0;int min =Math.min(a, b);int max =Math.max(a, b);int[] count =newint[32];
count[0]= max;for(int i =1; i <32; i++){
count[i]=(count[i-1]*2);if((1<<(i+1))> max){break;}}System.out.println(Arrays.toString(count));int result =0;while(min >0){for(int i =30; i >=0; i--){if(min >=(1<< i)){
min -=(1<< i);
result += count[i];}}}return result;}}
快速幂
前面三个if是为了应对特殊情况,如果num ^ exponentiation 的 exponentiation为0,则返回值1,exponentiation为1,则返回值 num
第一个for循环也是为了构造上面所说的数组
while循环,从数组右边往左找,找到对应的值相乘就得到我们要的值了
publicclassFastExponentiation{publicstaticvoidmain(String[] args){int i =newFastExponentiation().fastExponentiation(9,1);System.out.println(i);}publicintfastExponentiation(int num,int exponentiation){if(exponentiation ==0)return1;if(num ==0)return0;if(exponentiation ==1)return num;int[] count =newint[32];
count[0]= num;for(int i =1; i <32; i++){
count[i]=(count[i-1]* count[i-1]);if((1<<(i+1))> exponentiation){break;}}System.out.println(Arrays.toString(count));int result =1;while(exponentiation >0){for(int i =30; i >=0; i--){if(exponentiation >=(1<< i)){
exponentiation -=(1<< i);
result *= count[i];}}}return result;}}
将 result *= count[i] 替换成 result = fastMultiplication(result, count[i])
publicclassFastExponentiationOptimization{publicstaticvoidmain(String[] args){int i =newFastExponentiationOptimization().fastExponentiation(4,10);System.out.println(i);}publicintfastExponentiation(int num,int exponentiation){if(exponentiation ==0)return1;if(num ==0)return0;if(exponentiation ==1)return num;int[] count =newint[32];
count[0]= num;for(int i =1; i <32; i++){// count[i] = (count[i-1] * count[i-1]);
count[i]=fastMultiplication(count[i-1], count[i-1]);if((1<<(i+1))> exponentiation){break;}}System.out.println("fastExponentiation:"+Arrays.toString(count));int result =1;while(exponentiation >0){for(int i =30; i >=0; i--){if(exponentiation >=(1<< i)){
exponentiation -=(1<< i);// result *= count[i];
result =fastMultiplication(result, count[i]);}}}return result;}publicintfastMultiplication(int a,int b){if(a ==0|| b ==0)return0;int min =Math.min(a, b);int max =Math.max(a, b);int[] count =newint[32];
count[0]= max;for(int i =1; i <32; i++){
count[i]=(count[i-1]*2);if((1<<(i+1))> max){break;}}System.out.println("fastMultiplication:"+Arrays.toString(count));int result =0;while(min >0){for(int i =30; i >=0; i--){if(min >=(1<< i)){
min -=(1<< i);
result += count[i];}}}return result;}