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
解题思路: 因为做了大数相加 ,这题也就没什么好思考的。不同之处就是先去掉小数点,计算结果后在适当位置插入小数点即可。这个算法可以计算更大的数。但必须包含小数点。。。。。。
AC代码如下:
#include <iostream>
#include <string>
using namespace std;
// 求幂 思路: 先变成整数相乘 然后根据小数的位数 结合幂 算出小数点该结果字符串的位置 即可
string bigIntegerPlus(string src, string num) {
string tmp = src;
for (int i =num.length() -1; i >= 0 ; --i) {
string mid(tmp.length(),'0');
int goBit =0;
for (int j = tmp.length()-1; j >= 0; --j) {
int tm = goBit + (tmp[j] -'0')* (num[i] - '0');
mid[j] = tm% 10 +'0';
goBit = tm /10;
}
for (int q = num.length()-1; q> i; --q)
mid.push_back('0');
if (goBit != 0)
mid.insert(0, string(1, (char)goBit +'0'));
// 加法运算
if (i == num.length()-1)
src = mid;
else {
goBit =0;
string s(mid.length() - src.length(), '0');
src = s + src;
for (int j = mid.length()-1; j>=0; --j) {
int tm = (mid[j] - '0') +(src[j] - '0') + goBit;
src[j] = tm %10 + '0';
goBit = tm /10;
}
if (goBit !=0)
src.insert(0, string(1, (char)goBit +'0'));
}
}
return src;
}
int main(int argc, char** argv) {
string str;
while ( getline(cin, str)) {
// 分割出待积数 和 幂 以及小数点位置
int i =0;
int index = 0;// 小数位置
int count = 0;//幂次数
string num;
while ( i< str.length()) {
if ( str[i] != ' ') {
if (str[i] == '.')
index = i;
else
num.push_back(str[i]);
++i;
continue;
}
while ( !isdigit(str[i]))
++i;
if (i + 1 == str.length())
count = str[i] - '0';
else
count = (str[i] - '0') * 10 + str[i+1] - '0';
break;
}
index = num.length() - index;
string res = num;
for (int i =0; i< count-1; ++i) {
res = bigIntegerPlus( res, num);
}
index = index * count;
res.insert(res.length() - index, string("."));
while (res.length() >1 && res[0] == '0')
res.erase(0, 1);
for (int i =res.length()-1; i>=0; --i) {
if (res[i] == '0' )
res.erase(i, i+1);
else
break;
}
cout<< res<< endl;
}
return 0;
}