看到论坛里一个小问题,自己也写了下

本文介绍了一个C语言程序,该程序能够接收多个一位数字输入,并统计每个数字出现的次数。之后,程序将根据出现次数对这些数字进行排序输出,若出现次数相同,则按数字大小降序输出。

问题:输入任意多个一位数字(0-9),然后按照出现次数输出.

我写的对应功能如下:

1.可以接受任意多个一位数;

2.按照出现次数多少排序输出;

3.如几个数字出现次数相同时,按照数字由大到小排序(这个要是由小到大就能省去冒泡排序后的那一块儿).


#include<stdio.h>  
void Pro(int ar[],int n);
void Bubble_Sort(int Num[],int len);  //冒泡排序  
int Idex[10]={0,1,2,3,4,5,6,7,8,9};   //可能出现的数字组成的数组
int main(void)  
{  
    int i,n;      
    puts("Input the number of elements to the array:");  
        scanf("%d",&n);  
    int ar[n];                      //变长数组,编译器需要支持C99标准才行.   
    puts("Input n numbers:");  
    for(i=0;i<n;i++)                //读取数组元素  
        scanf("%d",&ar[i]);  
    Pro(ar,n);    
    putchar('\n');
    return 0;  
}  
void Pro(int ar[],int n)
{
     int i,j=0,temp;
     int Num[10]={0}; 

     for(i=0;i<n;i++)     //统计各个数字出现的次数 
     {
         temp=ar[i];
         switch(temp)
         {
		 case 0:Num[0]++;break;
		 case 1:Num[1]++;break;
		 case 2:Num[2]++;break;
		 case 3:Num[3]++;break;
		 case 4:Num[4]++;break;
		 case 5:Num[5]++;break;
		 case 6:Num[6]++;break;
		 case 7:Num[7]++;break;
		 case 8:Num[8]++;break;
		 case 9:Num[9]++;break;
		 default :       break;
         }
     }	
    Bubble_Sort(Num,10);                    //排序 
      
    for(i=1;i<10;i++)                       //如果出现次数相同,则按数字由大到小排列 
        for(j=0;j<10-i;j++)
        {
            if(Num[j]==Num[j+1] && Num!=0)
                if(Idex[j]<Idex[j+1])
                {
                    temp=Idex[j];
                    Idex[j]=Idex[j+1];
                    Idex[j+1]=temp;
                }
        } 
    
    puts("统计结果如下(出现次数由多到少排序,出现次数相同时按数字由大到校排序,数字后括号内为其出现的次数统计):");
    for(i=0;i<10;i++)
	{
		if(0!=Num[i])             //过滤掉后面次数为0的元素 
            printf("%d(%d)  ", Idex[i],Num[i]);
	}
	putchar('\n');
     
}
void Bubble_Sort(int Num[],int len)      //冒泡排序  
{  
    int i,j,temp1,temp2;  
    for(i=1;i<len;i++)  
    {  
        for(j=0;j<len-i;j++)            //循环找到下沉"气泡",每下沉一位,下次比较长度小一位   
        {  
            if(Num[j]<=Num[j+1])  
            {  
                temp1=Num[j];          //数字交换 
                Num[j]=Num[j+1];  
                Num[j+1]=temp1;

				temp2=Idex[j];        //次数对应数字也同时移动 
				Idex[j]=Idex[j+1];
				Idex[j+1]=temp2;
            }  
        }  
    }  
}  


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值