雙精度 pow() 精度有限 (約 15-17 位有效數字),大指數需高精度整數/小數運算。
#include
#include
#include
#define MAX_DIGITS 10000
void multiply(int *a, int *len, int multiplier) {
int carry = 0;
for (int i = 0; i < *len; i++) {
int prod = a[i] * multiplier + carry;
a[i] = prod % 10;
carry = prod / 10;
}
while (carry > 0) {
a[*len] = carry % 10;
carry /= 10;
(*len)++;
}
}
void powerHighPrecision(char *baseStr, int exp) {
// 解析底數 (支援小數)
int decimalPos = -1;
for (int i = 0; baseStr[i]; i++)
if (baseStr[i] == '.') { decimalPos = i; break; }
int digits[MAX_DIGITS] = {0};
int len = 0;
// 存儲去小數點後的整數
for (int i = strlen(baseStr) - 1; i >= 0; i--) {
if (baseStr[i] != '.') digits[len++] = baseStr[i] - '0';
}
int decimalDigits = (decimalPos == -1) ? 0 : (strlen(baseStr) - decimalPos - 1);
// 快速冪
int result[MAX_DIGITS] = {1};
int resLen = 1;
int base[MAX_DIGITS];
memcpy(base, digits, len * sizeof(int));
int baseLen = len;
int baseDecimal = decimalDigits;
while (exp > 0) {
if (exp & 1) {
// result *= base
int temp[MAX_DIGITS] = {0};
int tLen = 0;
for (int i = 0; i < resLen; i++) {
int carry = 0;
for (int j = 0; j < baseLen; j++) {
int idx = i + j;
int prod = result[i] * base[j] + temp[idx] + carry;
temp[idx] = prod % 10;
carry = prod / 10;
}
int idx = i + baseLen;
while (carry) { temp[idx++] = carry % 10; carry /= 10; }
}
// 更新 result
resLen = 0;
while (temp[resLen] || resLen < MAX_DIGITS-1) resLen++;
memcpy(result, temp, resLen * sizeof(int));
decimalDigits += baseDecimal;
}
// base *= base
// ... 類似平方邏輯 ...
exp >>= 1;
}
// 輸出結果 (插入小數點)
// ...
}
int main() {
char base[100];
int exp;
while (scanf("%s %d", base, &exp) == 2) {
powerHighPrecision(base, exp);
}
return 0;
}
O(log n) 乘法次數 vs 線性 O(n)O(n log n) 乘法