您的位置:首页 > 其它

关于POJ1001的解题报告<面向菜鸟>

2011-02-13 17:55 417 查看
  本题是poj的第二题,相信很多人都没有A掉,因为比较繁,我也是今天下了很大的决心才做的。和简单的高精度题目相比本题多了一个小数点,这就是难的地方。所以稍不留神就会出错。做完以后需要注意的地方也想不起来了,大致说一下吧。

  我的想法其实比较简单。(1)对于整数,要分为输入的整数和输入的小数点后全是0的数。对于这样的数就当整数处理,利用高精度的计算方法(可参考前辈的模板)。如果是赤裸裸的整数,即没有小数点的,直接计算输出。如果有小数点,就把小数点和小数点以后的0全部删掉,用string很方便解决。然后计算输出。(2)对于浮点数,应该也要分为两种吧。小数点前有非零位和没有非零位的。反正无论对于哪种,小数点都要先删除,然后记录小数点后第一位到最后一个非零位的距离d。然后计算,得到一个字符串,把前导0全去掉。模板里面一般会把0去掉。然后判断从最后一个非零位到第一位的距离是否大于等于d,如果小于,则先在前面加d个0及一个点。然后输出,如果大于等于,在d位前输出一个0。

  说起来比较复杂,其实不难。除了细心没有别的需要注意的地方。另外java里面就有高精度计算的类,不过java貌似在acmer里面普及的不是很广,如果直接用java做会比较方便。java里面需要注意的就是判断输入是否结束这一点上。把代码贴出来供大家参考。

poj1001:http://poj.org/problem?id=1001

c/c++的代码

#include<iostream>
#include<fstream>
#include<sstream>
#include<vector>
using namespace std;
int count(string s)
{
int tot = 0;
for (int i = 0; i < (int)s.length(); i++)
if (s[i] == '0')tot++;
else break;
return tot;
}
string mul(string s1,string s2)
{
int len1 = (int)s1.length();
int len2 = (int)s2.length();
string str(len1 + len2, '0');
for (int n2 = len2 - 1; n2 >= 0; n2--)
{
if (s2[n2])
for (int n1 = len1 - 1, n = n2 + len1; n1 >= 0; --n1, --n)
{
int temp = (s1[n1] - '0') * (s2[n2] - '0');
str[n - 1] = (char)(str[n - 1] + (str
+ temp - '0') / 10);
str
= (char)((str
+ temp - '0') % 10 + '0');
}
}
if (count(str) == str.length())
return "0";
return str.substr(str.find_first_not_of('0'));//去掉前导0
}
int main()
{
ifstream cin("a.txt");
string s, goal;
int n;
while (cin>>s>>n)
{
int i, j, temp = -1, length = (int)s.length();
for (j = length - 1; j >= 0; j--)
if (s[j] == '.')break;
goal = "1";
if (!j)
{
for (int i = 0; i < n; i++)
goal = mul(goal, s);
cout<<goal<<endl;
}else {
for (i = length - 1; i >= 0 ; i--)
if (s[i] != '0')break;
string::iterator it = s.begin();
if (s[i] == '.')
s.erase(it + j, s.end());//如果是小数点后全是0,把小数点及以后数字全部删除
else s.erase(it + j);//或者只删除小数点
for (int t = 0; t < n; t++)
goal = mul(goal, s);
if (i == j)
{
cout<<goal<<endl;
continue;
}
int k, l, t = 0;
for (l = (int)goal.length() - 1; l >= 0; l--)
if (goal[l] != '0')break;
while (t + l < (i - j) * n)t++;
if (t)
{
cout<<".";
for (int j = 0; j < t - 1; j++)
cout<<"0";
}
for (k = 0; k <= l; k++)
{
cout<<goal[k];
if (k == l - (i - j) * n)
cout<<".";
}
cout<<endl;
}
}
return 0;
}


java的代码,可以大大缩小时间和代码量

import java.io.*;
import java.util.*;
import java.math.*;

public class Main{
public static void main( String args[] )
{
int n;
String string;
BigDecimal goal;
Scanner cin = new Scanner(System.in);

while(cin.hasNextBigDecimal())//判断输入是否结束
{
goal = cin.nextBigDecimal();//输入浮点数
n = cin.nextInt();//输入整数
goal = goal.pow(n);//So easy
string = goal.stripTrailingZeros().toPlainString();
if(string.startsWith("0."))
string = string.substring(1);
System.out.println(string);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: