
很显然是等比数列求和的问题。首项为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;
}
675

被折叠的 条评论
为什么被折叠?



