在C加起来1/2 + 2/3 + ... + 18/19 + 19/20

时间:2013-05-17 18:18:16

标签: c

我差不多想在C中做1/2 + 2/3 + ... + 18/19 + 19/20,这是我的代码:

版本1:

int main(){
    double i,j,sum;

    for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++)
        sum+=i/j;
    printf("%f\n",sum);

    return 0;
}

版本1输出: 16.402260

版本2:

int main(){
    double i,j,sum;

    for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++)
        printf("%f\n",sum);

    return 0;
}

版本2输出:

0.000000
0.500000
1.166667
1.916667
2.716667
3.550000
4.407143
5.282143
6.171032
7.071032
7.980123
8.896789
9.819866
10.748438
11.681771
12.619271
13.560447
14.504892
15.452260

第3版:

int main(){
    double i,j,sum;

    for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++)
        ;
    printf("%f\n",sum);

    return 0;
}

版本3输出:

16.402260

我很困惑为什么版本1&amp; 3版本2没有,因为版本2和版本3是非常相似的,除了版本3的for循环包含和空体,而版本2没有。

5 个答案:

答案 0 :(得分:4)

你忘了括号。

for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++){
    sum+=i/j;
    printf("%f\n",sum);
}

在C / C ++中,你可以有一个两行for循环(或两行if语句),如下所示:

for()
  line to execute

它被编译器解释为

for()
{
    line to execute
}

但是,这个:

for()
line to execute
another line to execute

编译器会看到这样的:

for()
{
line to execute
}
another line to execute

答案 1 :(得分:4)

这是由于编译器如何转换for循环:

 for (i=1, j=2, sum=0; i <= 19 && j <= 20; i++, j++) { /* code */ }

 for (/* init */; /* condition */; /* increment*/) { /* code */ }

...执行为......

i=1, j=2, sum = 0; /* init */
while (i <= 19 && j <= 20) { /* condition */
  /* code */

  i++, j++;  /* increment */
}

因此,在版本2中,sum中的printf还没有最新值:

i=1, j=2, sum = 0; /* init */
while (i <= 19 && j <= 20) { /* condition */
  /* code */

  sum += i/j, i++, j++; /* increment */
}

...因为sum是增量的一部分。

干杯!

答案 2 :(得分:2)

案例1:

for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++)
        sum+=i/j;
        printf("%f\n",sum);

被解释为

for(i=1,j=2,sum=0; i<=19 && j<=20; i++, j++)
        sum+=i/j;
printf("%f\n",sum);

由编译器。 - printf只执行一次

案例3:

 for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++)
   ;
 printf("%f\n",sum);

printf在整个循环执行后执行。

如果你想在案例2中得到相同的结果:

for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++)
    ; /*let the loop complete, and then printf*/
    printf("%f\n",sum);

答案 3 :(得分:2)

在版本2中,您打印输出n-1而不是n。

你需要在循环结束后打印'sum'。

int main() {
  double i,j,sum;

  for(i=1,j=2,sum=0; i<=19 && j<=20; sum+=i/j, i++, j++) printf("%f\n",sum);

  printf("%f\n",sum);

  return 0;
}

答案 4 :(得分:0)

代码

    sum += i/j

正在最后一次printf之后执行。