C语言-5月11日-经典题型两个乒乓球队进行比赛的问题和钱的组合问题以及猴子吃桃问题的编写

两个乒乓球队进行比赛各出三人。甲队为A,B,C3人,乙队为X,Y,Z3人。以抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编写程序找出三对赛手的名单。

#include<stdio.h>
int main()
{
    int a,b,c;
    for(a='X';a<='Z';a++)//建立a所对应对手的循环条件
    {
        for(b='X';b <='Z';b++)//建立b所对应对手的循环条件
        {
            for(c='X'; c <= 'Z';c++)//建立c所对应对手的循环条件
            {
                if(a!=b && b!=c && a!=c && a!='X'&& c!='X'&& c!='Z')//此行代码分别是a所对应的对手不能和b,c重复,并且将题目所给出的‘A说他不和X比,C说他不和X,Z比’代码化进此处的if条件语句中来进行判断。
                {
                    printf("a->%c,b->%c,c->%c\n",a,b,c);//将最终结果输出
                }
            }
        }
    }
    return 0;
}

如图,为代码的执行结果:

可见代码的输出结果为a和Z比赛,b和X比赛,c和Y比赛,结果正确。

我遇到的问题:空语句。

在第一次写十一行代码写if判断句时不小心在if条件判断句后面不小心加了‘;’导致了空语句的存在,使计算机将每一次的尝试结果都进行输出,应特别注意条件判断句括号后面千万不能添加;。

同样运用到穷举for循环的一道题目 :组合钱的题目

1角,2角,5角,1元,组合成3.5元一共有多少种方式?

#include<stdio.h>
int main()
{
    int count = 0;//定义情况
    for(int i = 0; i<=35 / 1; i++){//一角
        for(int j = 0;j<=35 / 2;j++){//两角
            for(int k = 0;k<=35 / 5;k++){//五角
                for(int z = 0;z<=35 / 10;z++){//一元
                    if(i * 1 + j * 2 + k * 5 + z * 10 == 35){
                        count++;
                        printf("第%d种情况:1角的个数,2角的个数,5角的个数,1元的个数\n",count,i,j,k,z);
                    } 
                }    
            }
        }
    }
    printf("一共有%d种情况\n",count);
    return 0;
}

如图为运行结果:

输出完成

如图,四种钱币组合成3.5元一共有140种情况。

问题:猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩一个桃子了。求第一天共摘了多少桃子。

这个题目如果设第一天一共摘了多少桃子的数目为X的话,依次往后推各天数所剩的桃子会显得本题目非常的麻烦。但是如果我们把最后一天当作是第一天逆向往回推的话,问题就会变得简单不少。

那么此时我们把第一天桃子的个数当作是一个,那么第二天桃子的个数依照题意应该是(1+1)*2,结果为4,依次类推第三天桃子的个数就应该是(4+1)*2,结果为10,好,现在将思路进行代码化:

#include<stdio.h>
int main()
{
    int day;//定义天的整型值
    int peach = 1;//定义桃子的整型值
    for(day=1;day<=9;++day){
        peach = (peach + 1)*2;//将‘每天早上都吃了前一天剩下的一半零一个’代码化,从第一天开始,一共循环9次。
    }
    printf("第一天一共摘下的桃子数为:%d\n",peach);//将最终结果输出
    return 0;
}

如图所示为输出结果:

在此问题的基础上,如何更改代码实现可以通过输入数字来知道任何一天猴子吃剩下的桃子总数呢?我们可以将第几天的值从一开始的定义改为由用户自己输入,同样的将for循环里面的day初始值去掉改为由用户输入,代码如下:

#include<stdio.h>
int main()
{
    int day;//定义天数的概念
    printf("请输入第几天:\n");
    scanf("%d",&day);//输入第几天
    int peach = 1;//定义桃子的个数为1个
    for(day; day<= 9;++day){ //取消day的开始值,改为由用户输入
        peach = (peach + 1)*2;
    } 
    printf("这一天剩下的桃子个数为:%d\n",peach);
    return 0;
}

如图,我输入的day值分别为1和10:

输出完成

输出结果为1534,正好是猴子第一天摘下桃子总数。

输出完成

输出结果为1,正好是猴子最后一天所剩下的唯一一个桃子。

经过函数封装后的代码为:

#include<stdio.h>
#include<stdlib.h>
int getsum(int day)
{
    int peach = 1;//逆推法,定义第一天的🍑为1个
    for(day;day<=9;day++){
        peach = (peach + 1)*2;
    }
    return peach;//返回值为🍑
}
int main()
{
    int day = 0;
    scanf("%d",&day);
    printf("%d\n",getsum(day));
    return 0;
}

如图所示,我输入1,代表第一天一共摘了多少🍑:

 

输出完成

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ritchie_Zeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值