Exponentiation
Description
![Download as PDF Download as PDF](https://i-blog.csdnimg.cn/blog_migrate/2ea975a8d421ce3226c46b0946fd5932.png)
Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.
This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999) and n is an integer such that .
Input
The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.Output
The output will consist of one line for each line of input giving the exact value of R n. Leading zeros and insignificant trailing zeros should be suppressed in the output.Sample Input
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
Miguel A. Revilla
2000-02-09
大意:
给一组数字 R和N 求出R的N次方的大小
要点:
精确计算出小数点的位置
#include <iostream>
#include <string>
using namespace std;
int t[250], cur[250], beg[250];
string r;
int num;
int point;
bool coutf, delef;
void modulo()
{
for (int i = 0; i < 250; i++)
{
t[i + 1] += t[i] / 10;
t[i] = t[i] % 10;
}
}
void mypow(int m)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < 6; j++)
{
t[j + i] += cur[i] * beg[j];
modulo();
}
}
for (int i = 0; i < 250; i++)
{
cur[i] = t[i];
t[i] = 0;
}
}
int main()
{
while (cin >> r >> num)
{
coutf = true;
delef = false;
point = 0;
bool f = false;
for (int i = r.length() - 1; i >= 0; i--)
{
if (r[i] == '.')
{
delef = true;
break;
}
if (r[i] > '0')
f = true;
if (f)
point++;
}
int l = r.length() - 1;
if (delef)
{
for (int i = r.length() - 1; i >= 0; i--)
if (r[i] > '0')
{
l = i;
break;
}
}
for (int i = l, j = 0; i >= 0; i--, j++)
{
if (r[i] == '.')
{
j--;
continue;
}
cur[j] = r[i] - '0';
beg[j] = cur[j];
}
for (int i = 0; i < num - 1; i++)
mypow(6 * (i + 1));
if (point == 0 || !delef)
for (int i = 249; i >= 0; i--)
{
if (cur[i] == 0 && coutf)
continue;
coutf = false;
cout << cur[i];
}
else
{
bool f = false;
int nx = point * num;
for (int i = 249; i >= 0; i--)
{
if (i == nx - 1)
{
cout << ".";
f = true;
}
if (f)
cout << cur[i];
else
{
if (cur[i] == 0 && coutf)
continue;
coutf = false;
cout << cur[i];
}
}
}
cout << endl;
for (int i = 0; i < 250; i++)
t[i] = cur[i] = beg[i] = 0;
}
}