啊哈c语言——逻辑挑战14(一个萝卜一个坑)

发布时间:2024年01月23日

????????这里有一个有趣的问题:从键盘输入5个0~9的数,然后输出0~9 中那些没有出现过的数。例如,输入2 5 2 1 8时,输出0 3 4 6 7 9。

????????想一想,有没有什么好办法?

????????我们这里借助一个数组就可以解决这个问题。

????????首先我们需要申请一个大小为10的数组int a[10];。好了,现在你已经有了10个小房间,编号为a[0]~a[9]。

????????刚开始的时候,我们将a[0]~a[9]都初始化为0。

????????然后用a[0]来表示数字0是否会出现,用a[1]来表示数字1是否会出现……用a[9]来表示数字9是否会出现。

????????下面就好办了,一会儿哪个数字出现,我们就把相应的小房间的值 从0改为1。例如,第一个出现的数是2,我们就把a[2]这个小房间中的值 从0变为1。

????????

????????下一个出现的数是5,我们就把a[5]这个小房间中的值从0变为1。

????????注意啦,接下来出现的数又是2,此时a[2]这个小房间中的值已经是1,所以值还是1。

?????????接下来出现的数是1,我们就把a[1]这个小房间中的值从0变为1。

看一下最后a[0]~a[9]这10个小房间中的数,你会惊奇地发现:出现过的数,它们所对应的小房间中的值都为1;没有出现过的数所对应 的小房间中的值都为0。接下来,只需把小房间中值为0的小房间的编号输出就可以啦。

????????

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[10], i, t;
    for(i=0; i<=9; i++)
    a[i]=0; //初始化每个小房间为0
    for(i=1; i<=5; i++)
    {
        scanf("%d", &t); //依次读入5个数
        a[t]=1; //把对应的小房间改为1
    }
    for(i=0; i<=9; i++)
    if(a[i]==0) //输出没有出现过的数
    printf("%d ", i);
    system("pause");
    return 0;
}

????????好了,大功告成了!其实这个方法就是“一个萝卜一个坑”。我们将 0~9中的每个数都用单独1个房间来表示,每出现一个数,就将所对应的房间中的值改为1,最后只要看看哪些房间里面的值仍然是0就好了。

????????就好比原来有10个萝卜,从0~9编号:

????????然后安排人去拔萝卜,第1个人去拔2号萝卜。第2个人去拔5号萝卜,第3个人再去拔2号萝卜(其实此时2号萝卜已经被拔走了),第4个人去拔1号萝卜,第5个人去拔8号萝卜,最后剩下的萝卜的就是答案了。是不是很简单呢?

????????

????????下一个问题:如果现在需要将输入的5个数(范围是0~9)从小到大排序,该怎么办?例如,输入2 5 2 1 8,则输出1 2 2 5 8。

????????也很简单,只需将上面的代码稍加改动就可以了。

????????首先我们仍然需要申请一个大小为10的数组int a[10],编号为a[0]~ a[9],并初始化为0。

????????在之前的程序中,哪个数字出现了,我们就将相应的小房间的值从0变为1。而现在我们只需将“小房间的值从0变为1”改为“小房间的值加 1”就可以了。例如、2出现了,就将a[2]中的值加1。

????????接下来的数是5,就将a[5]中的值加1。

????????到目前为止,貌似和之前的程序没什么不同。下面,关键的一步来了。下一个出现的数又是2,我们再将a[2]中的值加1。

????????注意到没有,此时a[2]中的值为2。

????????接下来的数是1,就将a[1]中的值加1。

????????最后一个数是8,将a[8]中的值加1。

????????发现没有,其实a[0]~a[9]中所记录的数值就是0~9每个数所出现的次数。其中1出现1次,2出现2次,5出现1次,8出现1次。

????????接下来,我们只需将出现过的数,按照出现的次数打印出来就可以了。具体如下:

????????a[0]为0,表示0没有出现过,不打印。

????????a[1]为1,表示1出现过1次,打印1次。屏幕上显示“1”

????????a[2]为2,表示2出现过2次,打印2次。屏幕上显示“1 2 2”

????????a[3]为0,表示3没有出现过,不打印。

????????a[4]为0,表示4没有出现过,不打印。

???????? a[5]为0,表示5出现过1次,打印1次。屏幕上显示“1 2 2 5”

????????a[6]为0,表示6没有出现过,不打印。

????????a[7]为0,表示7没有出现过,不打印。

???????? a[8]为1,表示8出现过1次,打印1次。屏幕上显示“1 2 2 5 8”

???????? a[9]为9,表示9没有出现过,不打印。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[10], i, j, t;
    for(i=0; i<=9; i++)
    a[i]=0; // 初始化为0
    for(i=1; i<=5; i++) // 循环读入5个数
    {
        scanf("%d", &t); // 把每一个数读到变量t中
        a[t]++; // t所对应小房子中的值增加1
    }
    for(i=0; i<=9; i++) // 依次判断0~9这个10个小房子
    for(j=1; j<=a[i]; j++) //出现了几次就打印几次
    printf("%d ", i);
    system("pause");
    return 0;
}

????????至此,我们已经巧妙地将输入的数据,按照从小到大的顺序排序了。当然,你也可以从大到小排序,自己想一想吧!

文章来源:https://blog.csdn.net/weixin_43349327/article/details/135785312
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。