????????这里有一个有趣的问题:从键盘输入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;
}
????????至此,我们已经巧妙地将输入的数据,按照从小到大的顺序排序了。当然,你也可以从大到小排序,自己想一想吧!