1001:Exponentiation
-
总时间限制:
- 500ms 内存限制:
- 65536kB
-
描述
-
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 Rnwhere R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.
输入
- 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. 输出
- The output will consist of one line for each line of input giving the exact value of R^n. 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. 样例输入
-
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
样例输出
-
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
提示
-
If you don't know how to determine wheather encounted the end of input:
s is a string and n is an integer
C++ while(cin>>s>>n) { ... } c while(scanf("%s%d",s,&n)==2) //to see if the scanf read in as many items as you want /*while(scanf(%s%d",s,&n)!=EOF) //this also work */ { ... }
来源
- East Central North America 1988
- 查看
- 提交
- 统计
- 提示
- 提问
-
- 代码;
#include<iostream> #include<string> #include <algorithm> using namespace std; string multi(string str1, string str2){ reverse(str1.begin(), str1.end()); reverse(str2.begin(), str2.end()); size_t npos1 = str1.find('.'); size_t npos2 = str2.find('.'); if(npos1 == string::npos) npos1 = 0; else str1.erase(str1.begin() + npos1); if(npos2 == string::npos) npos2 = 0; else str2.erase(str2.begin() + npos2); string ans(str1.length() + str2.length(), '0'); for(size_t i = 0; i < str1.length(); ++i){ int carry = 0; for(size_t j = 0; j < str2.length(); ++j){ int val = ((str1[i] - '0') * (str2[j] - '0') + carry + ans[i + j] - '0'); ans[i + j] = val % 10 + '0'; carry = val / 10; } if(carry){ ans[i + str2.length()] = ans[i + str2.length()] + carry; } } size_t npos = npos1 + npos2; bool hasPoint = false; if(npos > 0){ ans.insert(npos, 1 ,'.'); hasPoint = true; } npos = ans.length() - 1; while(ans[npos--] == '0') ans.pop_back(); reverse(ans.begin(),ans.end()); if(hasPoint){ npos = ans.length() - 1; while(ans[npos--] == '0') ans.pop_back(); if(ans[npos + 1] == '.') ans.pop_back(); } return ans; } int main(){ string s,ans; int n; while(cin>>s>>n){ ans.assign(s); if(n == 1){ while(*(ans.begin()) == '0'){ ans.erase(ans.begin()); } size_t pos = ans.find('.'); if(pos != string ::npos){ pos = ans.length() - 1; while (ans[pos--] == '0') { ans.pop_back(); } if(ans[pos + 1] == '.') ans.pop_back(); } }else{ int bit = 1; for(int i = 2; i <= n; i<<=1){ bit = i; ans = multi(ans, ans); } for(int i = bit; i < n; ++i){ ans = multi(s,ans); } } cout<<ans<<endl; } return 0; }