本蒟蒻试图通过此题来加强各位萌新们对于for循环的理解。循环结构对于我们这种逻辑思维不够成熟的萌新来说实在太过阴间
上题:
小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 22 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98%。现在小玉想知道,如果要游到距离 s 米的地方,她需要游多少步呢。请你编程解决这个问题。
输入格式
输入一个实数 s(单位:米),表示要游的目标距离。
输出格式
输出一个整数,表示小玉一共需要游多少步。
输入输出样例
输入 #1
4.3
输出 #1
3
说明/提示
数据保证,0≤s<100,且 s 小数点后最多只有一位。
本蒟蒻理解如下:
#include<stdio.h>
#include<math.h>//由于使用了pow(x,y)函数,此函数具体作用是计算x的y次方。
int main()
{ double s,x=0.0,t=0.0; //s为目标距离(手动输入,没必要初始化),x是每轮增加的距离,t是游 到距离s米处必须要游的距离。
int e=0; //e为轮数也代表着所需游的步数 ,对e进行初始化。
scanf("%lf",&s); //输入目标距离(注意题干要求 实数
for(int i=0;t<s;i++) //此for循环利用必须要游的距离与目标距离关系一定为大于或等于来跳出循 环。(较为特殊)
{
x=2.0*pow(0.98,i);// 此处质数设置为i,利用循环使得每次x的值都在上一次的基础上乘98%,满 足题意。
t=t+x;// 利用t将各轮游泳距离相加,即必要游泳距离。
e++;// 计数器,记录总共步数。
}
printf("%d",e);
return 0;
}
此外该题特别点主要有如下三个:
定义方面,我将除e(e很显然是个整数)以外的变量均定义为double,目的就是为了使整个过程中不必要再去考虑类型转换(小技巧)。
for循环限定方面,与普遍题目不同,而使用t<s能更简便的表达该题所要的限定。
pow函数方面,利用每轮的差异仅仅只是多乘一个%98,而i又正好符合该点来作为指数。
也许各位萌新们与本蒟蒻一样在初见for循环相关题目时需要思考很久,只要勤加练习,一定可以越来越熟练。
ps:写题小技巧,在没有思路时,在草稿纸上进行模拟能更快找到突破点