关于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++的代码
java的代码,可以大大缩小时间和代码量
我的想法其实比较简单。(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); } } }
相关文章推荐
- poj 2773 Happy 2006解题报告 <欧拉函数>
- 2014蓝桥杯本科C/C++组预赛第9题<斐波那契>解题报告
- 关于为何设立<样本分析>这个栏目的问答及暂用分析报告格式
- zoj 3556 How Many Sets I 解题报告 <容斥原理>
- Leetcode<6 ZigZag Conversion>解题报告
- poj 3370 Halloween treats 解题报告 <鸽巢原理>
- hdu 1172 猜数字 解题报告<暴力枚举>
- 菜鸟关于 aps.net<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 的认识
- hdu 3929 Big Coefficients 解题报告 <容斥原理>
- 关于 Lazy<T>
- Android--关于String.xml中<xliff:g >标签的用法
- Mac下关于->您不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。<-的删除
- 关于hibernate中实体类为什么尽量序列化和类似<s:checkboxlist/>标签
- Effective C++: 关于staitic_cast<Base>(*this).func.
- 关于public <T> T method(T t)函数的说明
- POJ1001解题报告
- <cocos2dx 随记> 关于cocos2dx接Android sdk的一些坑
- <Linux下的摄像头>关于PAL制式与NTSC制式
- VC中关于vcxproj : error : 未找到导入的项目“*.props”。请确认 <Import> 声明中的路径
- 关于在freemarker模板中遍历数据模型List<JavaBean>的经验