回 帖 发 新 帖 刷新版面

主题:ZOJ 1045 (c语言)

原题:
http://acm.zju.edu.cn/show_problem.php?pid=1045

有两个程序,我的问题是为什么第一个是i-2,第二个是i-1?
两个程序都通过了..
第一个:#include <stdio.h>

int main()
{
    float n,s;
    int i;
    
    while(scanf("%f",&n) && n != 0.0) {
        s = 0.0;
        for (i=2; s < n; i++) {
            s += 1/(float)i;
        }
        printf("%d card(s)\n", i-2);   /*这里*/
    }
    return 0;
}




第二个:
#include<stdio.h>
int main()
{
    double n,s;
    int i;
    while(scanf("%lf",&n)&&n!=0.0)
    {
        s=0.0;
        for(i=2; ;i++)
        {
            s=s+1/(double)i;
            if(s>=n)
                break;
        }
        printf("%d card(s)\n",i-1);   /*这里*/
    }
    return 0;
}

回复列表 (共4个回复)

沙发

for (i=2; s < n; i++) 
for(i=2; ;i++)
两者的终止条件不同

板凳

如果你知道欧拉常数,这个题总可以在1微秒内解出。下面给出欧拉常数的定义:
欧拉常数有时也被称为gamma或者Euler-Mascheroni常数,它的精确值为.577215664901532860606512090082...(就像pi一样)。  欧拉常数不像pi何e那样众所周知,但是是很重要的,尤其是在数字理论中以及在某些涉及相关计算和公式的工程中。  欧拉常数是由表达式(1 + 1/2 + 1/3 + 1/4 + ... + 1/n) - ln (n)中n趋于无穷时的极限定义的。欧拉常数已经精确到了小数点后1000000位,不过一般约等于0.577216。

  上面这段话的意思是(1 + 1/2 + 1/3 + 1/4 + ... + 1/n)的极限是ln(n)+ 0.5772156649

3 楼

说到底还是结束条件不同.
①for (i=2; s < n; i++) 
 {
  s += 1/(float)i;
 }
②for(i=2; ;i++)
  {
   s=s+1/(double)i;
   if(s>=n)
   break;
  }
当s += 1/(float)i执行完后,①是执行i++后再判断s是否小于n,如果小于就结束循环;而②是先判断s是否小于n,如果小于就不执行i++了,直接结束循环.两者执行过程中i++的执行次数相差一次,所以一个是i-2,另一个是i-1

4 楼

精度

我来回复

您尚未登录,请登录后再回复。点此登录或注册