C语言练习题20-25题

前言

一次性写完的题目,我就不每个题都搞一个前言了,想必师父肯定能理解我的苦楚(●´∀`●)
题我肯定是认真思考了的,过程卡壳的地方我会边看边写,不存在敷衍了事的~
看完记得给我点赞噢 爱你爱你(ˆoˆԅ)

20题-25题

  • 前言
    • 第二十题
    • 第二十一题
    • 第二十三题
    • 第二十四题
    • 第二十五题

第二十题

题目:
一球从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;  //因为定义了双精度型,所以返回值要用浮点数
}

方法二:倒推法
采取逆向思维的方法,从后往前推断。

  1. 设x1为前一天桃子数,设x2为第二天桃子数, 则:
    x2=x1/2-1, x1=(x2+1)*2
    x3=x2/2-1, x2=(x3+1)*2

以此类推: x前=(x后+1)*2

  1. 从第10天可以类推到第1天,是一个循环过程。
#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;
}

运行结果:
在这里插入图片描述

第二十三题

题目:
打印出如下图案(菱形)。
C语言练习题20-25题_第1张图片

我的思路:
一遇到图形题,我就没辙,这个是真的不太会了。

我的过程

#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;

}

运行结果:
C语言练习题20-25题_第2张图片
不能说一毛一样,简直就是分毫未差

第二十四题

题目:
有一分数序列:+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);  
}

运行结果
在这里插入图片描述

总结:
累死了累死了累死了!!!!
这几个题都是典型的数列问题,在生活中也比较常见。在分析题目的时候尽量用未知变量来代替。程序的顺序、分支与循环都是基本结构,可以混合一起用。编程时要注意的细节,我都写在代码里面了。要学会用注释,方便你我他查阅、更改。
C语言练习题20-25题_第3张图片

你可能感兴趣的:(菜鸟进阶之路)