double myPow(double x, int n) { long long N=n; if(N<0){ x=1/x; N=-N; } double result=1; double temp=x; while(N!=0){ if( N & 1) result=result*temp; temp *=temp; N= N>>1; } return result;
使用二分法、递归的方式求解快速幂。
1 2 3 4 5 6 7 8
//数学类题目。使用快速幂 long long multi(long long x,int n){ if(n == 0) return 1; if(n == 1) return x; long long half = multi(x, n / 2); long long mod = multi(x, n % 2); return (half * half * mod)%1000000007; }
快速乘法
二进制的列竖式思想。
1 2 3 4 5 6 7 8 9
int quickMulti(int A, int B) { int ans = 0; while(B) { if (B & 1) ans += A; A <<= 1; B >>= 1 } return ans; }
快速加法
利用按位与和按位异或运算。求解加法。
循环加余法。
1 2 3 4 5 6 7 8 9
int add(int a,int b){ cout<<(unsigned int)-1<<endl; while(b != 0) { // 当进位为 0 时跳出 int c = ((unsigned int)(a & b)) << 1; // c = 进位 a ^= b; // a = 非进位和 b = c; // b = 进位 } return a; }
publicstaticintmultiply(int a, int b) { if (b == 0) return0; intresult=0; while (b != 0) { // 如果b的最低位是1 if ((b & 1) == 1) { result = add(result, a); } a = a << 1; // 相当于a * 2 b = b >> 1; // 相当于b / 2 } return result; }
publicclassBitwiseDivisionBinary { privatestaticintadd(int a, int b) { while (b != 0) { intcarry= (a & b) << 1; a = a ^ b; b = carry; } return a; } privatestaticintsubtract(int a, int b) { return add(a, add(~b, 1)); } privatestaticintmultiply(int a, int b) { if (b == 0) return0; intresult=0; while (b != 0) { if ((b & 1) == 1) { result = add(result, a); } a = a << 1; b = b >> 1; } return result; } // ✅ 位运算实现除法(二分查找,高效) publicstaticintdivide(int a, int b) { if (b == 0) thrownewArithmeticException("除数不能为0"); booleannegative= (a < 0) ^ (b < 0); longabsA= a < 0 ? -(long)a : a; longabsB= b < 0 ? -(long)b : b; longresult=0; // 从高位到低位进行二分 for (inti=31; i >= 0; i--) { // 如果 absB << i <= absA,则第i位为1 if ((absB << i) <= absA) { absA = subtract(absA, absB << i); result = result | (1L << i); // 设置第i位为1 } } return (int)(negative