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

  本题是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[n] + temp - '0') / 10);
				str[n] = (char)((str[n] + 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);
        }
    }
}
posted @ 2011-02-13 17:55  like@neu  阅读(333)  评论(0编辑  收藏  举报