我以前学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,但 i 仍是int,所以1/i,也是个整型数据,则后面加的1/2、1/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下运行通过】
(如有错误,敬请指正)