北大OJ 1003Hangover && 1001Exponentiation思路

1003 Hangover AC:

#include using namespace std; double getSum(int n) { float dRet = 0.00; int i = 1; while ( i <= n ) dRet = dRet + 1.00/(++i); return dRet; } int main(int argc, char *argv[]) { float dFlag; int iNum = 0; while ( cin >> dFlag ) { if ( dFlag < 0.01 || dFlag > 5.20 ) break; while ( getSum(++iNum)

 

这个题目比较简单,只是想读懂题目花了很久时间。英语水平实在是...

数次才AC,小细节疏忽。

 

1001 Exponentiation 思路:

这题是要输出高精度的数,按照题目的要求要达到125位小数至少。但是一般的double类型是无法满足输出的,精度最大17位(我试了,但网上说是18位),所以根本无法通过常规的方法实现。

 

第一次是想把float数拆开成好几份,然后各自记住每一份需要乘以10的几次方。计算各自结果以后再求和,,,但是我太天真了。因为最后还是需要求和啊,精度没有啊。。所以,必须要通过字符串来实现了。

 

题目要求只是按照要求输入/输出即可。

 

1、把基数A转化成字符串先:比如1.234转化成字符串"1.234"。方法有一个很妙的:

#include ... stringstream ss; double dNum = 1.2345; string strNum; ss << dNum; ss >> strNum;//"1.2345"

反正我第一次看到这个方法的时候,心里猛的一爽。很妙啊真的。

 

2、转换成字符串后,保存下其小数点的位数point,并把小数点移除;

3、n次方一定是把自己乘上n次,那只要写一个函数用来处理stringA × stringB就行啦;实现就是人工的构造乘法的运算规则,按位一个个的求结果,然后相加。每次乘的时候都要取字符,转化成int,然后相乘的结果保存下来,,最后把每位求的结果乘以相应的10的某次方后相加。。这样模拟乘法运算规则。最后当然是转化成字符串回去。

4、最后通过n次调用函数最后会求得一个很长的字符串,但是没有小数点,那我们用point*n就可以知道结果的小数点位数。接下来的,就好办了~

 

这是我的思路,,恩 不知道和不合理。。貌似很麻烦呢。。。这道题的AC率很低,,不知道有没有好的方法了。

你可能感兴趣的:(北大OJ 1003Hangover && 1001Exponentiation思路)