题目反思 4(等比数列的前n项和)

很显然是等比数列求和的问题。首项为2,公比为0.98。

很快就能想到两种思路,法一:先定义一个函数f(int x),求出2*0.98^x,也就是这个等比数列的第x+1项.接着定义 float sum=0,s.  int i=1.   s就是输入的路程,i就是游的步数。当sum小于s的时候,sum=sum+f(i),然后i再自增1。这样就实现了f(1)+f(2)+...的计算(f(n)就相当于an,sum就相当于an的前n项和Sn)。然后输出即可。这里需要注意的是,由于在while循环中,先让sum自增,再让i自增,这样会导致输出的i并不是游过的步数,而是步数+1.

举个例子,假设:s是4.5,现在sum是4.1,i是3,f(3)=0.7.  由于4.1<4.5,所以进入while循环,sum=sum+f(3)=4.1+0.7=4.8.接着i再自增1变成4.但是我们游了三步就游出了4.8m,所以最后输出的应该是i-1.因为在最后一次循环中,当sum>s,i还会自增1才结束循环。

代码如下:

#include<iostream>
#include<cmath>//为了求幂而引入<cmath>头文件,使用pow函数.
using namespace std;
float f(int x)//由于公比不为整数,所以会出现非整数的项,所以前n项和也可能会是非整数,因此定义该函数返回值为float
{
  return 2*pow(0.98,x-1);//pow(a,b)==a的b次方
}
int main()
{
    float sum=0,s;
  	cin >> s;
	int i = 1;
	while (sum < s)
		{
			sum = sum + f(i);
			i++;
		}
	cout << i - 1;
	return 0;
}

法二:直接套用等比数列前n项和公式:Sn=a1*(1-q^n)/(1-q).显然Sn是n的显函数,因此可以反解n.

需要注意的是,由于步数为正整数,所以这里还需要对n进行进一步处理。是直接取int(相当于往下取)?还是四舍五入?还是往上取?举个例子就可以明白:如果算出n=2.5,那就说明游2步是不够的,至少需要游3步。因此需要往上取n.用ceil进行处理就可以(反之,如果要往下取,就用floor)。此外,还要注意的是,c++里面的logx默认为以e为底x的对数,所以还需要用一下对数换底公式,这个十分简单,无需赘述。这个方法是最直接简单的。

代码如下:

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
   double s;
   cin>>s;
   cout<<ceil(log(1-s/100)/log(0.98));
   return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值