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

1-1/2+1/3-1/4+…+1/99-1/100将结果输出,该怎么处理

2012-04-28 
1-1/2+1/3-1/4+……+1/99-1/100将结果输出#includestdio.hvoid main(){float sum1.0,t,s1int ifor(i1

1-1/2+1/3-1/4+……+1/99-1/100将结果输出
#include<stdio.h>
void main()
{
 float sum=1.0,t,s=1;
 int i;
 for(i=1;i<=100;i++)
 {
  t=s/i;
  sum=sum+t;
  s=-s;
 }
 printf("1-1/2+1/3-1/4+……+1/99-1/100=%5.4f\n",sum);
}
为什么运行结果是1-1/2+1/3-1/4+......+1/99-1/100= inf

[解决办法]

C/C++ code
// 1-1/2+1/3-1/4+......+1/99-1/100=#include <stdio.h>void main() {    double sum=0.0,t,s=1.0;    int i;    for (i=1;i<=100;i++) {        t=s/(double)i;        sum=sum+t;        s=-s;        printf("%d %.15lg\n",i,sum);    }    printf("1-1/2+1/3-1/4+……+1/99-1/100=%.15lg\n",sum);}//1 1//2 0.5//3 0.833333333333333//4 0.583333333333333//5 0.783333333333333//6 0.616666666666667//7 0.759523809523809//8 0.634523809523809//9 0.745634920634921//10 0.645634920634921//11 0.736544011544012//12 0.653210678210678//13 0.730133755133755//14 0.658705183705184//15 0.72537185037185//16 0.66287185037185//17 0.721695379783615//18 0.66613982422806//19 0.718771403175428//20 0.668771403175428//21 0.716390450794476//22 0.67093590533993//23 0.714414166209495//24 0.672747499542829//25 0.712747499542829//26 0.67428596108129//27 0.711322998118327//28 0.675608712404042//29 0.710091471024731//30 0.676758137691398//31 0.709016202207527//32 0.677766202207527//33 0.708069232510557//34 0.678657467804675//35 0.707228896376103//36 0.679451118598326//37 0.706478145625353//38 0.680162356151668//39 0.705803381792694//40 0.680803381792694//41 0.705193625695133//42 0.681384101885609//43 0.704639915839098//44 0.681912643111825//45 0.704134865334047//46 0.682395734899265//47 0.703672330643946//48 0.682838997310612//49 0.703247160575918//50 0.683247160575918//51 0.702855003713173//52 0.683624234482404//53 0.702492159010706//54 0.683973640492187//55 0.702155458674006//56 0.684298315816863//57 0.701842175465985//58 0.684600796155641//59 0.701549948698013//60 0.684883282031347//61 0.701276724654297//62 0.685147692396233//63 0.701020708269249//64 0.685395708269249//65 0.700780323653864//66 0.685628808502349//67 0.700554181636677//68 0.685848299283736//69 0.700341052906925//70 0.68605533862121//71 0.700139845663464//72 0.686250956774575//73 0.699949586911561//74 0.686436073398048//75 0.699769406731381//76 0.686611511994539//77 0.699598524981552//78 0.686778012161039//79 0.69943624000914//80 0.68693624000914//81 0.699281919021486//82 0.687086797070267//83 0.699134989841351//84 0.687230227936589//85 0.698994933818942//86 0.687367026842198//87 0.698861279715761//88 0.687497643352125//89 0.698733598408304//90 0.687622487297193//91 0.698611498286204//92 0.687741933068813//93 0.698494621240856//94 0.687856323368516//95 0.698382639157989//96 0.687965972491323//97 0.698275250841838//98 0.688071169209185//99 0.698172179310195//100 0.688172179310195//1-1/2+1/3-1/4+……+1/99-1/100=0.688172179310195
[解决办法]
精度问题

#include<stdio.h>
#include<stdlib.h>
int main()
{
double sum=0.0, temp=0.0; 
int i, sign;

i = 1;
while(i<101)
{
sign = ((i%2) == 0? 1:-1);
int mom = i%2;
temp = 1.0/i*sign;
sum += temp;
printf("%lf\n", sum);
i++;
}
printf("sum = %lf\n",sum);
return 0;
}
问题在这个地方:
我们知道对于整形的除法运算永远是整形
即 3/2=1 7/3=2 1/2=0
所以当i=1时 1/1=1, temp=1, sum=1
当i>=2时候 1/i=0 ,temp=1, sum=1.
由此可知是精度上出了问题,解决的方案是
使用高精度数据类型 即 1.0/2 =0.5 
1.0默认的是double类型 问了ok了

[解决办法]
#include<stdio.h>
void main()


{
double s=0,t;
int i;
for(i=1;i<=100;i++){
if(i%2==0)
s-=1/(double)i;
else
s+=1/(double)i;
}
printf("1-1/2+1/3-1/4+……+1/99-1/100=%lf\n",s);
}
[解决办法]

C/C++ code
#include<stdio.h>void main(){    double s=0;    int i;    for(i=1;i<=100;i+=2){        s+=(1/(double)i)*(1/((double)i+1));    }    printf("1-1/2+1/3-1/4+……+1/99-1/100=%lf\n",s);}
[解决办法]
为什么sum不能初始值为0能?

[解决办法]
[code=C/C++][/code]
#include"stdio.h"
void main()
{
int i;
float a,
b=1.0,sum=0.0;
for(i=1;i<=100;i=i+1)
{
a=b/(float)i;
sum=sum+a;
b=-b;
}
printf("sum=%g\n",sum);
}

热点排行