这个题目本身没什么好说的,很简单,只是要注意的是浮点数在机器中的表示是不精确的。
那么下面就是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之间。