C语言:用字符串处理求大整数n各位组成的最大最小数及代码排错
代码错误排查及修复方案
已知错误点
- 排序逻辑错误:当前插入排序实现的是升序排列,而生成最大整数需要将数字按降序排列,这是用例1输出不符合预期的核心原因。
- 输入处理错误:
fgets读取输入时会把末尾的换行符\n也写入字符串,排序时换行符(ASCII码为10,远小于数字字符的ASCII码范围48~57)会参与排序,导致长输入(如用例2)的结果完全错乱。 - 功能未完成:当前仅写了最大数的部分逻辑,未实现最小整数生成,且生成最小整数时需要额外处理前导零的问题(比如输入2015时最小数不能输出0125,要输出1025)。
修复后完整代码
#include <stdio.h> #include <string.h> // 生成最大整数 void get_max(char s[]) { int l = strlen(s); int i, key, j; // 改为降序插入排序 for (i = 1; i < l; i++) { key = s[i]; j = i - 1; while (j >= 0 && s[j] < key) { s[j + 1] = s[j]; j--; } s[j + 1] = key; } printf("最大整数:%s\n", s); } // 生成最小整数 void get_min(char s[]) { int l = strlen(s); int i, key, j; // 升序插入排序 for (i = 1; i < l; i++) { key = s[i]; j = i - 1; while (j >= 0 && s[j] > key) { s[j + 1] = s[j]; j--; } s[j + 1] = key; } // 处理前导零:找到第一个非零字符和首位交换 if (s[0] == '0') { for (i = 1; i < l; i++) { if (s[i] != '0') { char temp = s[0]; s[0] = s[i]; s[i] = temp; break; } } } printf("最小整数:%s\n", s); } int main() { char s[100]; fgets(s, sizeof(s), stdin); // 去掉fgets读取的末尾换行符 s[strcspn(s, "\n")] = '\0'; char s_copy[100]; strcpy(s_copy, s); get_max(s); get_min(s_copy); return 0; }
验证结果
- 输入
2015:最大整数输出5210,最小整数输出1025,符合预期。 - 输入
47356359122:最大整数输出97655432211,最小整数输出11223455679,结果正确。
内容的提问来源于stack exchange,提问作者nanaboo
相关产品推荐
相关产品推荐

