POJ不提供后台的测试数据,但是这道题的测试数据很可能包含:
10.0
0.0
1.1
0.1
...
这类数据。
实现的方法:
1、先实现长整数的乘法(不细说)
2、在实现在结果中添加小数点:分三种情况,小数位数k=0,k<=整数数位m,k>m。
心得:
这道题不要太计较程序的速度,因为数据的量相比计算机的计算能力还是较小的。
因此可以多运用string函数库中的诸如insert、erase看似效率低的函数,简化实现难度,还是可以过的。
长整数乘法的过程中先将字符转变为数字,中间数据用字符来保存会造成溢出。
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
string dajiaxiao(string a, string b) {
int alen = a.size(), blen = b.size();
for (int i = 1; i <= b.size(); i++) {
a[a.size() - i] += b[b.size() - i];
a[a.size() - i] -= '0';
}
for (int i = 1; i < a.size(); i++) {
if (a[a.size() - i] > '9') {
a[a.size() - i - 1] += 1;
a[a.size() - i] -= 10;
}
}
if (a[0] > '9') { a[0] -= 10; a.insert(0, "1"); }
return a;
}
string jia(string a, string b) {
int alen = a.size(), blen = b.size();
if (alen >= blen)return dajiaxiao(a, b);
else return dajiaxiao(b, a);
}
string dachengxiao(string a,string b){
string tmp = "0"; string aa = a;
for (int i = b.size() - 1; i >= 0; i--) {
for (int j = 0; j < a.size(); j++) {
a[j] = (a[j] - '0')*(b[i] - '0');
}
for (int j = a.size() - 1; j > 0; j--) {
a[j - 1] += a[j]/ 10;
a[j] = a[j]% 10;
}
if (a[0] > 9) {
char c = a[0] / 10;
a[0] = a[0] % 10;
string sc = ""; sc += c;
a.insert(0, sc);
}
for (int j = 0; j < a.size(); j++)a[j] += '0';
tmp = jia(tmp, a);
aa=aa + '0';
a = aa;
}
//cout << "tmp " << tmp << endl;
return tmp;
}
string cheng(string a, string b) {
int alen = a.size(), blen = b.size();
if (alen >= blen)return dachengxiao(a, b);
else return dachengxiao(b, a);
}
int main()
{
string input;
while (getline(cin, input)) {
stringstream depart(input);
string num; int lev;
depart >> num; depart >> lev;
for (int i = num.size() - 1; i >= 0; i--) {
if (num[i] == '0')num.erase(i, 1);
else break;
}
for (int i = 0; i < num.size(); i++) {
if (num[i] == '0') {
num.erase(i, 1); i--;
}
else break;
}
int k = 0;
for (int i = num.size()-1; i >=0; i--) {
if (num[i] == '.') { num.erase(i, 1); break; }
else k++;
}
if (num == "")num = "0";
string num2 = num;
for (int i = 1; i < lev; i++) {
num2 = cheng(num2, num);
}
k *= lev;
if (k == 0) {
cout << num2 << endl;
}
else if (k <= num2.size()) {
num2.insert(num2.size() - k, ".");
cout << num2 << endl;
}
else if (k > num2.size()) {
cout << '.';
for (int i = 0; i < k - num2.size(); i++)cout << '0';
cout << num2 << endl;
}
}
return 0;
}