求1-1/2+1/3-1/4+...+1/99-1/100
尝试不用数学上的方法((-1)的n次方)来完成,用了一种比较笨的办法:
#include<stdio.h>
int main()
{
int i;
double j=0,n=0;
for(i=1;i<=100;i++)
{
j=j>0?(-(j+1)):(-j+1);
n+=1.0/j;
}
printf("%lf\n",n);
return 0;
}
后来想到把相似的作为一个单元:
#include<stdio.h>
int main()
{
int i,j;
double n=0;
for(i=1,j=2;(i<=99)&&(j<=100);i+=2,j+=2)
{
n+=1.0/i-1.0/j;
}
printf("%lf\n",n);
return 0;
}
或者:
#include<stdio.h>
int main()
{
int i;
double n=0;
for(i=1;i<=99;i+=2)//注意:i最大取99,i=i+2
{
n+=1.0/i-1.0/(i+1);
}
printf("%lf\n",n);
return 0;
}
但这种方法还是不够优化,主要问题就在符号的连续改变上,所以用sign专门负责符号的转换:
#include<stdio.h>
int main()
{
int i;
int sign=-1;
double sum=0;
for(i=1;i<=100;i+=1)
{
sign=-sign;
sum+=sign/(double)i; //这里要把i定义成double类型,或者在这先对其中一个进行强制类型转换
}
printf("%lf\n",sum);
return 0;
}
或者:
#include<stdio.h>
int main()
{
int sign=1; //控制符号变化,要初始化
double sum=0,i; //sum要初始化
for(i=1;i<=100;i+=1)
{
sum+=sign/i; //这里要把i定义成double类型,或者在这先对其中一个进行强制类型转换
sign=-sign;
}
printf("%lf\n",sum);
return 0;
}