c语言输入 100个整数,对这 100个整数进行排序,排序方法为:按照整数中数字 6出 现的次数进行升序排列,次数相同时,则按照实际大小进行升序排列,输出排序之后的数据。

题目来源:桂林理工大学c语言考研真题

思路:首先想到的是把100个数,按6出现的次数进行分类,出现0次的全部放在最前面,之后根据6出现的次数,按顺序依次放在数组中,最后将6出现次数相同的数据进行冒泡排序。

注:由于100个数,数据量手动输入太麻烦,代码中只取5个数,如果自己想测试100个数,自行修改。

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
// 函数用于计算整数中数字6的出现次数
int count(int num) {
    int count = 0;
    while (num > 0) {
        if (num % 10 == 6) {
            count++;
        }
        num /= 10;
    }
    return count;
}
//  //bubble函数是关键所在
void bubble(int* s, int start, int end) {  //对次数相同的数字按照从小到大排序
    int i, j,k,l,m; //k,l,m代表的是冒泡排序中实际数组每次循环比较的机制
    k = end - start;//k代表每次6出现次数相同数字的个数
    for (i = start,l=0; l < k - 1; l++,i++) {  //之后每次循环不会丢失c数组中的值,这里很巧妙,注意体会
         for (j = start,m=0; m < k - 1 - l;m++, j++) {
                if (s[j] > s[j + 1]) {
                    int temp = s[j + 1];
                    s[j + 1] = s[j];
                    s[j] = temp;
                }
         }
    }
}

int main(){
    int a[100], b[100], c[100], j = 0, k = 0, max = 0,start,end;
    //a数组保存键盘输入的数据
    //数组b统计每个数字中6,出现的次数,
	//c用于存储排序排序后的数字;
    //输入数据
    for (int i = 0; i < 5; i++) {  //如果想测试100个数据,i改为100
        scanf("%d", &a[i]);
    }

    for (int i = 0; i < 5; i++) {  
        b[i] = count(a[i]);
        if (b[i] > max) {
            max = b[i];  //记录6出现次数的最大值
        }
    }
    while (j <= max) {  //j的作用就是表示6的次数从0到最大值,每次循环+1
        start = k;//记录第一次数相同的数字的位置
        for (int i = 0; i < 5; i++) {
            if (b[i] == j) {   //这里就是把出现次数相同的放入数组
                c[k++] = a[i];//b[i]记录每个数字中6的次数,把次数相同的数放到c数组中,从次数为0的先开始
            }
        }
        end = k; //记最后一个次数相同的数字的位置
        j++;  //6的次数依次增加
        bubble(c, start, end);//次数相同进行排序
    }
    //输出
    for (int i = 0; i < 5; i++) {
        printf("%d ", c[i]);
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值