首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个小疑点(新手)

2012-08-07 
一个小问题(新手)运行环境:winxp vc6.0代码如下:#includestdio.h/*这是一个解limit1+1/2-1/3+1/4-1/5+.

一个小问题(新手)
运行环境:winxp vc6.0
代码如下:
#include<stdio.h> /* 这是一个解 limit<1+1/2-1/3+1/4-1/5+....+1/m的程序 (limit是常数) */
#include<stdlib.h>
#include<conio.h>

int main()
{
double sum=1; /* declaration */
int i=1;
int limit=1;

printf("please input the limitation:\n"); /* input */
scanf("%d",&limit);
system("CLS");
printf("please wait for some time");

while(sum-limit<=0)
{
i++;
if (i%2==0)
sum=sum+1.0/i;
else
sum=sum-1.0/i;
}

system("CLS"); /* output */
printf("the answer is %d",i);

getch();
return 0;
}

问题:编译可以通过,但运行时除了输入1时输出正确,大于1的输入输出都为0,why???

[解决办法]
这是一道简单的数学题
1+1/2-1/3+1/4-1/5+....+1/m
它可以划分为以下两种算法

1+(1/2-1/3)+(1/4-1/5)+……
由此可知,这个计算式的结果大于1

1+1/2-(1/3-1/4)-(1/5-1/6)-……
由此可知,这个计算式的结果小于1.5

当你输入的limit大于2时,正常的数学计算,它永远也不可能达到跳出循环的条件
但这是计算机,int型整数有表达范围,i一直自加下去最终会循环回0
此时sum加上一个无穷大的数,满足跳出循环的条件,你得到了你想要的结果

热点排行