代码问题:统计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
相关产品推荐
相关产品推荐

