for循环举例(1+1/2+1/3...+1/99+1/100)

来源:互联网 发布:php优酷真实地址解析 编辑:程序博客网 时间:2024/05/30 13:42

我以前学C语言时学的很不扎实,再加上长时间没有看书,所以忘了许多知识(其实有许多知识当初就没掌握),所以即使做起以前的题来,也很难一步到位,比如说一个关于for循环的小题:求1+1/2+1/3...+1/99+1/100的和。一看到这个题时,我略一思考,即刻写出了代码,代码如下:

# include <stdio.h>int main(void){int i;float sum = 0;for(i=1; i<=100; ++i){sum = sum + 1/i;}printf("sum = %f\n",sum);return 0;}

其结果为:


这个结果当然是错误的,那么错在何处呢?

首先,这个和肯定是个实数(这里说的实数指的是浮点型数据),但sum的数据类型虽然已经是 float,但 仍是int,所以1/i,也是个整型数据,则后面加的1/21/3...1/100因为是整型,所以最终加进去的值都变成了0,这样结果当然错误了。已经找到原因,那我们该如何解决这个问题呢? 有两种方法:

一,for控制的语句中的1/i改成1.0/i,如下所示:

for(i=1; i<=100; ++i){    sum = sum + 1.0/i;}

这样可以得到正确结果;

二,1/i中的i进行强制类型转化,即

for(i=1; i<=100; ++i){    sum = sum + 1/(float)(i);}

这样也可以得到正确结果。(需要说明的是,在C语言中进行强制类型转化时,后面的被转化变量有时需要加括号,有时不需要加括号,一般推荐都加上括号

对于这两种方法,我们推荐使用第一种,其源码如下:

# include <stdio.h>int main(void){int i;//这里 i不能用浮点型,因为下边会用到i++,如果i用了浮点型,代码也可以编译通过,但不要这样做,坚决不要!!!float sum = 0;for(i=1; i<=100; ++i){sum = sum + 1.0/i;//推荐使用//sum = sum + 1/(float)(i); 这两种格式效果相同 其中(float)(i)是强制类型转化,把整型变量变为浮点型,不推荐使用}printf("sum = %f\n",sum);return 0;}
最终正确结果为:

好了,就这样了。

【所有代码均在windows系统下VC++6.0下运行通过】

如有错误,敬请指正

1 0
原创粉丝点击