You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码问题:统计100-200唯一数字正常但排序功能失效

问题排查与修复方案

问题根源

你用numbers数组的索引对应数字(input-100)来标记唯一数字,有效数字是分散在数组中的(比如输入105会存在numbers[5],输入110存在numbers[10])。但调用sort(numbers, count)时,你只对数组的前count个元素排序,而这前count个元素里大部分是初始的0(无效值),真正的有效数字可能在数组后面的位置,导致排序逻辑完全错位,自然无法得到正确结果。

修复方案

有两种简单的修复思路:

思路1:收集有效数字到连续数组后排序

统计完唯一数字后,把numbers数组里的非0有效数字提取到一个连续数组中,再对这个数组排序和打印:

#include <stdio.h>

void sort(int *numbers, int count) {
   for (int m = 0; m < count; m++) {
        for (int j = 0; j < count - m - 1; j++) {
            if (numbers[j] > numbers[j + 1]) {
               int temp = numbers[j];
                numbers[j] = numbers[j + 1];
                numbers[j + 1] = temp;
            }
        }
    }
}

void printA(int *numbers, int count) {
    for (int i = 0; i < count; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");
}

int main() {
    int numbers[101] = {0};
    int input, count = 0;

    printf("Enter numbers between 100 and 200 (enter a number outside this range to finish):\n");

    while (1) {
        scanf("%d", &input);
        if (input < 100 || input > 200) {
            break;
        }
        if (numbers[input - 100] == 0) {
            count++;
            numbers[input - 100] = input;
        }
    }

    printf("\nTotal unique numbers entered: %d\n", count);

    // 收集有效数字到连续数组
    int valid_nums[101];
    int idx = 0;
    for (int i = 0; i < 101; i++) {
        if (numbers[i] != 0) {
            valid_nums[idx++] = numbers[i];
        }
    }

    sort(valid_nums, count);
    printA(valid_nums, count);

    return 0;
}

思路2:利用数组索引天然有序特性直接打印

因为numbers数组的索引对应数字-100,从索引0到100遍历,遇到非0值直接打印就是升序结果,完全不需要额外排序:

#include <stdio.h>

int main() {
    int numbers[101] = {0};
    int input, count = 0;

    printf("Enter numbers between 100 and 200 (enter a number outside this range to finish):\n");

    while (1) {
        scanf("%d", &input);
        if (input < 100 || input > 200) {
            break;
        }
        if (numbers[input - 100] == 0) {
            count++;
            numbers[input - 100] = input;
        }
    }

    printf("\nTotal unique numbers entered: %d\n", count);

    // 按索引顺序打印非0值,天然有序
    printf("Sorted unique numbers: ");
    for (int i = 0; i < 101; i++) {
        if (numbers[i] != 0) {
            printf("%d ", numbers[i]);
        }
    }
    printf("\n");

    return 0;
}

这个思路更高效,无需额外排序操作,直接利用数组索引与数字的对应关系实现有序输出。

内容的提问来源于stack exchange,提问作者Diogo Ruas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:22:29