初出茅庐的小李第9篇博客之嵌入式C语言实现1-1/2+1/3-1/4+......+1/99-1/100(四种方法笔记)

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
显然,并不会影响太大,这一点如果我们不是做很大的浮点运算,我觉得真的可以忽略不计;

总结
这是一道基础题目,尚且有很多种接法,更何况以后更加复杂多变的情况呢?肯定会有更多的东西需要去发现,初出茅庐的小李,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值