高精度算法簡單說明(poj1001)

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

高精度算法實際就是用數組模擬多位數,數組的每一個元素模擬大數的一位或者多位,從而實現加減乘除計算(跟小學學習的加減乘除的豎方程式類似)




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章