`
s1099
  • 浏览: 19479 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

1003 Hangover

    博客分类:
  • poj
阅读更多

这个题目本身没什么好说的,很简单,只是要注意的是浮点数在机器中的表示是不精确的。

那么下面就是AC的代码:

import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		float sum, num;
		while((num=in.nextFloat()) > 1.0/128) {
			sum = 0;
			int i;
			for(i = 2; sum < num; i++)
				sum += 1.0/i;
			System.out.printf("%d card(s)\n", i-2);
		}
	}
}

但是这个题目中给出的这个级数挺有意思的,它的名字叫做调和级数,它的数学化表示是:


                         

它的性质很是特别,关于调和级数的介绍,推荐看一下维基百科。

http://zh.wikipedia.org/wiki/调和级数

 

当然这个题目不只这一种方法,注意到题目中输入的范围是从0.01到5.20,这里我们可以将调和级数在这个范围内事先求出(270个左右)放到数组中,之后再在数组中查找即可。

 

还有一种比较神奇的方法是利用公式,这里面用到了调和级数的前k项和公式。遗憾的是,在这里这种方法不太适合,因为这里用到的k值较小,如果将另一项和k有关的项忽略掉,误差较大,求出来的值与实际值误差在+-1之间。

  • 大小: 1.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics