除了要排序的数字,不要额外输入其他值,该怎么写
时间: 2024-02-25 14:52:00 浏览: 12
如果不允许输入其他值,可以使用 `fgets()` 函数读取一整行字符串,然后使用 `sscanf()` 函数从字符串中解析数字。改动的地方如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 1000000
// 求最大值
int findMax(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
// 基数排序
void radixSort(int arr[], int n) {
int max = findMax(arr, n); // 找到最大值
int exp = 1;
int *bucket = (int *)malloc(sizeof(int) * n); // 申请桶空间
while (max / exp > 0) {
int count[10] = {0}; // 每个桶的计数器
for (int i = 0; i < n; i++) {
int digit = (arr[i] / exp) % 10; // 获取当前位的数字
count[digit]++;
}
for (int i = 1; i < 10; i++) {
count[i] += count[i - 1]; // 累计计数器
}
for (int i = n - 1; i >= 0; i--) {
int digit = (arr[i] / exp) % 10; // 获取当前位的数字
bucket[count[digit] - 1] = arr[i];
count[digit]--;
}
for (int i = 0; i < n; i++) {
arr[i] = bucket[i];
}
exp *= 10;
}
free(bucket); // 释放桶空间
}
int main() {
int *arr = (int *)malloc(sizeof(int) * MAX_SIZE);
int n = 0;
char line[1024];
printf("请输入要排序的正整数,数字之间以空格隔开:");
fgets(line, 1024, stdin);
char *p = strtok(line, " \n");
while (p != NULL) {
sscanf(p, "%d", &arr[n]);
n++;
p = strtok(NULL, " \n");
}
radixSort(arr, n); // 基数排序
printf("排序后的正整数为:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
free(arr); // 释放数组空间
return 0;
}
```
这样就可以只输入数字并且自动进行排序了。