1. 程式人生 > >冪運算 C++(快速冪和大數運算)

冪運算 C++(快速冪和大數運算)

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;
}