题目是求两个级数1+(1/n)和1+(-1)*n*(1/n)的前n项和,n为用户输入的一个整数
初始代码为:
#include<stdio.h>
int main(void)
{
int a,i,c=1;
float sum,b;
printf("请输入一个整数:\n");
scanf("%d",&a);
while(a>0)
{
for(sum=0,i=1;i<=a;i++)
{
sum=sum+1/i;
}
printf("%f\n",sum);
for(sum=0,i=1;i<=a;i++)
{
b=1*c/i,
sum=sum+b;
c*=-1;
}
printf("%f\n",sum);
scanf("%d",&a);
}
return 0;
}
此时编译时不会报错,但是无论输入的整数为多少,程序输出的结果总为1。原因是当i>1时,计算机在做浮点运算时会把1/i舍弃,而不会时按照我们以为的1/2,1/3....正确的做法应该是改成1.0/i,此时程序就能正确输出结果,修改后的程序如下:
#include<stdio.h>
int main(void)
{
int a,i,c=1;
float sum,b;
printf("请输入一个整数:\n");
scanf("%d",&a);
while(a>0)
{
for(sum=0,i=1;i<=a;i++)
{
sum=sum+1.0/i;
}
printf("%f\n",sum);
for(sum=0,i=1;i<=a;i++)
{
b=1.0*c/i,
sum=sum+b;
c*=-1;
}
printf("%f\n",sum);
scanf("%d",&a);
}
return 0;
}
修改了两处浮点运算的代码sum=sum+1.0/i;b=1.0*c/i,此时程序能正确运行出结果。