ZOJ 1216

这几天真是做这个做上瘾了,估计是beginner的题做的比较H,哈哈。

但话又说回来了,尽管都很简单,我还是收获不少。

 

ZOJ 1216, 放卡片的问题,记得小时候看见这个问题。

用递推很容易得到:

f(n) = f(n-1) + 1/(2n)

f(0) = 0

 

这样就很容易求解了。

 

注意到以下几点:

1,我用了空间换时间的方法,预先把 n<100000的f(n)都计算出来,成为一个表,然后查表便是。

2,scanf() 的返回值:成功时返回置参数的个数,出错返回EOF,在实现中,EOF常可能是 -1,故

while( scanf( ... ) )

这样是不对的,应该:

while( EOF != scanf( ...) )

 

#include<stdio.h> #define MAX_CARDS 100000 double Overhang[MAX_CARDS]; void init( void) { Overhang[0] = 0; int i; for( i=1; i < MAX_CARDS; i++) Overhang[i] = Overhang[i-1] + 0.5/ (double)i ; return; } int main(void) { int n; init(); printf("# Cards Overhang/n"); while( EOF != scanf("%d", &n) ) printf("%5d %4.3f/n", n, Overhang[n]); return 0; }

 

你可能感兴趣的:(ZOJ 1216)