一次性写完的题目,我就不每个题都搞一个前言了,想必师父肯定能理解我的苦楚(●´∀`●)
题我肯定是认真思考了的,过程卡壳的地方我会边看边写,不存在敷衍了事的~
看完记得给我点赞噢 爱你爱你(ˆoˆԅ)
题目:
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
碎碎念:
头一次在编程题里遇到物理题,我的思路有点断了,先用物理知识做出来之后再看看怎么转化。
我的思路:
1、输入:小球从100米高空自由落下
输出:第10次落下时共经过了多少米,反弹高度。
2、分析:这用数字展开其实就是一个数列问题。一个等比数列的求和以及求第十项的大小问题。用数学来做 so easy。
我的过程:
# include
# include
int main(void)
{
float a = 100; //等比数列首项;
float q = 0.5; //公比
float s,b; //定义等比数列的和s,第十项h;
b = a*pow(q,10);//第十次弹起的高度,注意第十次落地的高度需要h*2
s = 2*(50-b*q*2)/(1-q)+100;
printf("第十次的高度为%f;\n总路程为%f\n",b,s);
return 0;
}
题目:
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
碎碎念:
这样的题目,我仿佛回到了小学一样。老规矩先在草稿纸上算一遍,整理出数学公式,转化为代码。
我的思路:
1、题目是个逆向思维,可以转化为正向。
输入:X个桃子
输出:9天后只剩一个桃子
所求:第一天所摘的X个桃子
2、写出数学过程后,发现这还是个等比数列和1等差数列混合运用的问题。
我的过程:
方法一:函数法,正向迭代
#include
double strangeEat(double n,int day);
int main()
{
for(double i=2;;i+=2)/*因为最后一天只剩一个桃,之前九天多吃1个桃。
总共多吃了10个桃。
所以第一天的桃子数可以整除*/
if(i==strangeEat(i,1))
{
printf("%.lf",i);
break;
}
return 0;
}
double strangeEat(double n,int day)
{
if(day<=9)
return n/2+1+strangeEat(n/2-1,day+1); //这个是计算出的数学公式
else
return 1.0; //因为定义了双精度型,所以返回值要用浮点数
}
方法二:倒推法
采取逆向思维的方法,从后往前推断。
以此类推: x前=(x后+1)*2
#include
#include
int main()
{
int day, x1=0, x2;
day=9;
x2=1;
while(day>0) {
x1=(x2+1)*2; // 第一天的桃子数是第2天桃子数加1后的2倍
x2=x1;
day--;
}
printf("总数为 %d\n",x1);
return 0;
}
我的思路:
一遇到图形题,我就没辙,这个是真的不太会了。
我的过程
#include
int main()
{
int s[7][7]={
{0,0,0,1,0,0,0},
{0,0,1,1,1,0,0},
{0,1,1,1,1,1,0},
{1,1,1,1,1,1,1},
{0,1,1,1,1,1,0},
{0,0,1,1,1,0,0},
{0,0,0,1,0,0,0},
};
int i,j;
for(i=0;i<7;i++)
{
for(j=0;j<7;j++)
{
if(s[i][j]==1) /*我知道这题想考的是逻辑转换,运算之类的问题
但我这样写,也不算过分吧! 哈哈哈哈(〜^㉨^)〜*/
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
题目:
有一分数序列:+2/1,-3/2,+5/3,-8/5,+13/8,-21/13…求出这个数列的前20项之和。
我的思路:
1、又是数列…先从这个数列中找规律,该数列中前后有以下关系:
分子为前一个数的分子与分母之和
分母为前一个数的分子
相邻数的符号正好相反,就可以单独设定一个表示正负的变量sign,初值设为1,令sign=-sign 就可以使符号取反交替。
2、输入:这组分数序列
输出:前20项的和
我的过程:
#include
int main()
{
int count,sign=1; //count控制求前20项之和
double fm=1,fz=2,sum=0; //赋初值
for(count=0;count<20;count++)
{
sum=sum+sign*fz/fm; //sign*fz/fm为数列的每一项
fz=fz+fm;
fm=fz-fm;
sign=-sign; //下一项的符号,交替取反
}
printf("数列前20项的和为:%.2lf\n",sum);
return 520;
}
运行结果:
总结
对于类似的求数列的问题,一般要先找出其每项的构成规律。如本例,关键是抓住分子与分母的变化规律,然后用循环去求,从而得到所求值,因此解决有规律的数据求和求积问题的方法,先考虑数据个数(循环次数)后分析数据与循环变量的关系。
题目:
求1+2!+3!+…+20!的和。
我的思路:
这题太简单了╮( ̄▽ ̄")╭
1、将具体数列转化为n!的形式。
2、用for循环来相加
我的过程:
#include
int main()
{
int i,sum,n;
sum=0,n=1;
for(i=1;i<=20;i++)
{
n=n*i;
sum=sum+n;
}
printf("%d\n",sum);
}
总结:
累死了累死了累死了!!!!
这几个题都是典型的数列问题,在生活中也比较常见。在分析题目的时候尽量用未知变量来代替。程序的顺序、分支与循环都是基本结构,可以混合一起用。编程时要注意的细节,我都写在代码里面了。要学会用注释,方便你我他查阅、更改。