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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:39:01