# Recursion# Divide and Conquer# Math

d475 - 玩具求幂题(求幂系列题2)

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算整數 an 次方,並輸出結果。輸入為多組 an,直到輸入 0 0 為止。輸出時,除了計算結果外,還需在所有輸入結束後輸出 "All Over. Exceeded [超過的行數] lines!"。

解題思路

本題使用遞迴的方式計算 an 次方。核心思想是利用分治法,將 a^n 分解為 (a^(n/2))^2。如果 n 是奇數,則結果為 (a^(n/2))^2 * a。遞迴的終止條件為 n 等於 0,此時返回 1,以及 n 等於 1,此時返回 a

複雜度分析

  • 時間複雜度: O(log n)
  • 空間複雜度: O(log n)

程式碼

#include <iostream>
using namespace std;
int pw(int base,int p){
	if(p==0)return 1;
	else if(p==1)return base;
	int k=pw(base,p/2);
	if(p%2)return k*k*base;
	return k*k;
}
int main() {
	cin.tie(0);cin.sync_with_stdio(0);
	int n,a,line=0;
	while(cin >> a >> n){
		if(a==0&&n==0)break;
		cout << pw(a,n) << "\n";
	}
	while(cin >> a >> n)
		++line;
	cout << "All Over. Exceeded " << 65536 << " lines!\n";
	return 0;
}

Discussion