C语言必会100题(5)。猴子吃桃问题/两个乒乓球队进行比赛/打印出如下图案(菱形)/求数列的前20项和(2/1,3/2,5/3,8/5,、、)/求1+2!+3!+...+20!的和

特此鸣谢:鱼C_小甲鱼(B站up主)不二如是(鱼C论坛大佬)
题目来源:https://fishc.com.cn
注:这些题在网上都可以搜到,题下面的代码大多是流传下来的答案(我重新排了一下版,增加了可读性),部分是本人经过深思熟虑后编写的。

21,猴子吃桃问题

1.题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
2.程序分析:采取逆向思维的方法,从后往前推断。最后一天剩一个,可知倒数第二天有4个,倒数第三天有10个,倒数第四天有22个。
3.程序源代码:

  1. 第一种解:
#include <stdio.h>

int main() {
    int i;
    int a[11];

    a[0] = 1;
    for(i = 1; i < 10; i++) {
        a[i] = (a[i - 1] * 2) + 2;
    }

    printf("第1天共摘了%d个桃子\n", a[9]);
    return 0;
}

  1. 第二种解:
#include <stdio.h>

int main()
{
    int day, x1, x2;
    day = 9;
    x2 = 1;

    while(day > 0)
    {
        x1 = (x2 + 1) * 2;// 第一天的桃子数是第2天桃子数加1后的2倍
        x2 = x1;
        day--;
    }

    printf("the total is %d\n", x1);

    return 0;
}

22,两个乒乓球队进行比赛

1.题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
2.程序源代码:

#include <stdio.h>

int main()
{
    char i, j, k;//i是a的对手,j是b的对手,k是c的对手
    
    for(i = 'x'; i <= 'z'; i++)
    {
        for(j = 'x'; j <= 'z'; j++)
        {
            if(i != j)
            {
                for(k = 'x'; k <= 'z'; k++)
                {
                    if(i != k && j != k)
                    {
                        if(i != 'x' && k != 'x' && k != 'z')
                        printf("order is a--%c\tb--%c\tc--%c\n", i, j, k);
                    }
                }
            }
        }
    }
    return 0;
}

23,打印出如下图案(菱形)

1.题目:打印出如下图案(菱形)

   *
  ***
 *****
*******
 *****
  ***
   *

2.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
3.程序源代码:

#include <stdio.h>

int main()
{
    int i,j,k;
    
    for(i = 0; i <= 3; i++)
    {
        for(j = 0; j <= 2 - i; j++)
          printf(" ");
        for(k = 0; k <= 2 * i; k++)
          printf("*");
        printf("\n");
    }
    for(i = 0; i <= 2; i++)
    {
        for(j = 0; j <= i; j++)
          printf(" ");
        for(k = 0; k <= 4 - 2 * i; k++)
          printf("*");
        printf("\n");
    }
}

24,求数列的前20项和,2/1,3/2,5/3,8/5,、、

1.题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
2.程序源代码:

  1. 第一种解:
#include <stdio.h>

int main() {
    float m = 2, n = 1, transfer;// 我也不清楚为啥用float,但是你用int答案不对。
    int i;
    float a;
    float sum;

    a = m / n;
    sum = a;

    for(i = 1; i < 20; i++) {
        transfer = m;
        m = m + n;
        n = transfer;
        a = m / n;
        sum = sum + a;
    }
    printf("这个数列前20项和是:%f\n", sum);
    return 0;
}

  1. 第二种解:
#include <stdio.h>

int main()
{
    int n, t, number = 20;
    float a = 2, b = 1, s = 0;

    for(n = 1; n <= number; n++)
    {
        s = s + a / b;

        t = a;
        a = a + b;
        b = t;//这部分是程序的关键,请读者猜猜t的作用
    }

    printf("sum is %9.6f\n", s);
    return 0;
}

25,求1+2!+3!+…+20!的和

1.题目: 求1+2!+3!+…+20!的和
2.程序源代码:

  1. 第一种解:
#include <stdio.h>

int main() {
    int i;
    int count = 1;
    float sum = 1;
    double result = 0;

    while(count != 21) {
        for(i = 1; i <= count; i++) {
            sum = sum * i;
        }
        result = result + sum;
        sum = 1;
        count++;
        printf("result:%lf\n", result);
    }

    printf("最后的结果是:%e\n", result);
    return 0;
}

  1. 第二种解:
#include <stdio.h>

int main()
{
    float n, s = 0, t = 1;
    for(n = 1; n <= 20; n++)
    {
        t *= n;
        s += t;
    }

    printf("1+2!+3!...+20! = %e\n", s);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值