Exponentiation
Exponentiation |
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基于大数的乘法( http://blog.csdn.net/u011863942/article/details/25001689)再做处理即可,注意两点:第一,0.0的指数需要单独处理;第二,末尾的零需要删除
#include<iostream>
#include<sstream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
#define MAX 1000000
int ans[MAX];
string Multi(string str1, string str2){
int i;
stringstream s;
string str;
memset(ans, 0, sizeof(ans));
for(i = str1.size()-1; i >= 0; i--){
for(int j = str2.size()-1, p = str1.size()-1-i; j >=0; j--, p++){
ans[p] += (str1[i]-'0')*(str2[j]-'0');
}
}
for(i = 0; i < MAX; i++){
ans[i+1] += ans[i]/10;
ans[i] = ans[i]%10;
}
for(i = MAX-1; i >=0; i--){
if(ans[i])
break;
}
if(i == -1)
return "0";
else{
for(int j = i; j >= 0; j--){
s << ans[j];
}
s >> str;
return str;
}
}
int main(void){
string str, ans;
int n;
#ifndef ONLINE_JUDGE
freopen("f:\\infile.txt", "r", stdin);
#endif
while(cin >> str >> n){
int dot, ansdot, i;
ans = "1";
dot = str.find('.', 0);
ansdot = (str.size()-1-dot)*n;
str.erase(dot, 1);
for(i = 0; i < n; i++){
ans = Multi(ans, str);
}
if(ans == "0"){
cout << ".0" << endl;
continue;
}
else{
if(ans.size() < ansdot)
ans.insert(0, ansdot-ans.size(), '0');
ans.insert(ans.size()-ansdot, 1, '.');
}
for(i = ans.size()-1; i >=0; i--){
if(ans[i] != '0')
break;
}
ans.erase(ans.begin()+i+1, ans.end());
cout << ans << endl;
}
return 0;
}