C语言实现1-1/2+1/3-1/4+…+1/99-1/100
小李为什么写这篇博客呢?
因为我发现一题多解这种方法对提高编程能力确实是一个不错的办法,既可以更加全面的理解编程的思路,又可以借鉴别人先进的编程方法从而拓展自己的编程思维;
话不多说分析一下这道经典的题目,不知道我的用词是否准确,这是一个求和的问题,1/1 -1/2 1/3 -1/4正负号交替出现,这种摆动数列在数学上很容易用一个(-1)的n次方的形式找出通项公式,但是编程强调解决问题,具体问题具体分析,运行出来正确结果的代码才是好代码;
方法1奇数偶数区别对待
int fangfa1(void)
{
int i;
float num=0,sum=0;
for(i=1;i<=100;i++)
{
num=1.0/i;//类型转换
if(i%2==0)//i是偶数
{
num=-num;
}
sum=sum+num;
}
printf("sum=%.2f\n",sum);//格式化输出
return 0;
}
方法2两个循环正负分家
int fangfa2(void)
{
int i;
float sum=0;
for(i=1;i<=99;i=i+2)//正数的循环
{
sum+=(1.0/i);//类型转换
}
for(i=2;i<=100;i=i+2)//负数的循环
{
sum-=(1.0/i);
}
printf("sum=%.2f\n",sum);//格式化输出
return 0;
}
方法3一个循环两个变量
int fangfa3(void)
{
int i,j;
float sum=0;
for(i=1,j=2;i<=99;i+=2,j+=2)//巧用循环变量,区分正负
{
sum+=(1.0/i)-(1.0/j);
}
printf("sum=%.2f\n",sum);//格式化输出
return 0;
}
方法4简单粗暴,但不一定高效
int fangfa4(void)
{
int i;
float sum=0;
for(i=1;i<=100;i++)
{
sum+=(1.0/i)*(pow(-1,i+1));//传统思维,找通项公式
}
printf("sum=%.2f\n",sum);//格式化输出
return 0;
}
为什么这么说,因为这里用来一个数学函数,需要引入对应的头文件不说,而且据说这个函数不是很高效,待我一会儿我去验证一下
方法有多种类,但结果就一个
#include <stdio.h>
#include <math.h>
int main(void)
{
fangfa1();
fangfa2();
fangfa3();
fangfa4();
return 0;
}
结果都是0.69
引用数学函数真的会导致效率低下吗?
Process exited after 0.04092 seconds with return value 0
Process exited after 0.0416 seconds with return value 0
Process exited after 0.04633 seconds with return value 0
Process exited after 0.04436 seconds with return value 0
显然,并不会影响太大,这一点如果我们不是做很大的浮点运算,我觉得真的可以忽略不计;
总结:
这是一道基础题目,尚且有很多种接法,更何况以后更加复杂多变的情况呢?肯定会有更多的东西需要去发现,初出茅庐的小李,加油!