poj1001題就是一個計算R的n次方的問題,由於數據範圍 0.0 < R < 99.999 , 0 < n <= 25,可知結果數據範圍遠遠大於long double (long double: 12 byte = 96 bit範圍: 1.18973e+4932 ~ 3.3621e-4932)的範圍,即應使用高精度算法。
這裏需要注意的是:Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.(就是輸出的時候前置0和小數後面的0都不需要輸出,如果是整數不需要輸出小數點),這個很簡單就是結果出來以後整數部分從高位往低位判斷,小數部分從低位向高位判斷即可。
代碼:
#include<iostream>
using namespace std;
int a[1000], b[1000], length;
void optionFunction(int num[], int n,int numCount)
{
for (size_t i = 0; i < numCount; i++)
{
b[i] = num[i];
}
length = numCount;
for (size_t ii = 0; ii < n - 1; ii++)
{
for (size_t i = 0; i < numCount; i++)
{
for (size_t j = 0; j < length; j++)
{
a[i + j] += num[i] * b[j];
}
}
b[0] = a[0] % 10;
int k;
length += numCount;
for (k = 1; k < length; k++)
{
b[k] = a[k - 1] / 10 + a[k] % 10;
a[k - 1] = 0;
}
a[k - 1] = 0;
for (size_t i = 0; i < length; i++)
{
b[i + 1] += b[i] / 10;
b[i] = b[i] % 10;
}
while (b[length - 1]>9)
{
b[length] = b[length - 1] / 10;
b[length - 1] = b[length - 1] % 10;
length++;
}
}
}
int main()
{
char numChar[6];
int numInt[5];
int wei = 0;
int n;
for (size_t i = 0; i < 1000; i++)
{
a[i] = 0;
b[i] = 0;
}
while (cin >> numChar >> n)
{
int count = 4;
for (size_t i = 0; i < 6; i++)
{
if (numChar[i] == '.')
{
wei = 5 - i;
}
else
{
numInt[count] = numChar[i] - 48;
count--;
}
}
optionFunction(numInt, n,5);
int dian = 0;
for (size_t i = 0; i < wei*n; i++)
{
if (b[i]==0)
{
dian++;
}
else
{
break;
}
}
for (size_t i = length-1; i >wei*n-1;i--)
{
if (b[i] == 0)
{
length--;
}
else
{
break;
}
}
for (int i = length - 1; i >= dian; i--)
{
if (wei*n == i+1)
{
cout << '.';
}
cout << b[i];
}
cout << endl;
}
return 0;
}
高精度算法實際就是用數組模擬多位數,數組的每一個元素模擬大數的一位或者多位,從而實現加減乘除計算(跟小學學習的加減乘除的豎方程式類似)