冪運算 C++(快速冪和大數運算)
阿新 • • 發佈:2019-01-26
1. 快速冪
提高運算速度。傳統冪時間複雜度為O(n),使用快速冪縮小為O(logn),其中n為指數。
基本思想:
base*=base 這裡就是在算
int poww(int a, int b){ // return a ^ b
int ans = 1, base = a;
while(b != 0){
if(b&1 != 0) ans *= base;
base *= base;
b>>=1;
}
return ans;
}
2. 大數運算
很顯然直接算的話就溢位了。我們可以把結果當成字串來處理。
輸入:
34 67
輸出:
4065251716212557932550840533486793017502084747731049146444657475519303778647807844035539194338024095744
#include <iostream> #include <stdio.h> #define MAX 1000000 using namespace std; int nbit; int ans[MAX]; void init(){ nbit = 1; ans[0] = 1; } void mul(int num){ int temp_add = 0; int temp_mul = 0; for(int i = 0; i < nbit; i++){ temp_mul = num * ans[i]; ans[i] = (temp_mul + temp_add) % 10; temp_add = (temp_mul + temp_add) / 10; } while(temp_add){ ans[nbit++] = temp_add % 10; temp_add /= 10; } } void exp(int b, int e){ for(int i = 0; i < e; i++) mul(b); } void vout(){ for(int i = nbit - 1; i >= 0; i--) printf("%d", ans[i]); printf("\n"); } int main(){ int b, e; while(~scanf("%d %d", &b, &e)){ init(); exp(b, e); vout(); } return 0; }