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

C语言实现整数各位重排求最大最小值代码报错求解

报错原因
  • 你将num定义为int类型数组,但代码中直接对数组名做num/=10、num!=0这类算术、判断操作。C语言中数组名是指向数组首元素的指针,不能直接做算术赋值,这就是第10、17行警告的来源:将指针类型值直接赋给int变量,未做显式类型转换。
  • original = num的写法同样是把数组首地址(指针值)赋值给int类型的original,属于同类问题。
  • num[i] = num写法左右类型不匹配:左侧是int类型的数组元素,右侧是指针类型的数组名;同时C语言规定数组名是不可修改的左值,直接对数组名做赋值操作(比如num /=10)是非法的,这就是第16、29行"assignment to expression with array type"错误的来源:试图给数组类型的表达式赋值。
  • 代码逻辑本身也存在缺陷:scanf("%[^\n]", num)读取到的是字符序列,直接存入int数组拿到的是字符的ASCII码值,不是对应的数字;排序拼接逻辑中你一边遍历数组一边修改数组本身的基地址,会直接导致遍历逻辑完全失效。
实现思路
  • 直接将用户输入读取为字符数组,避免逐位拆分整数的麻烦,同时支持更长的数字输入,减少溢出风险。
  • 遍历字符数组,将数字字符转成对应的整数值(减去'0'的ASCII码即可),同时统计有效数字位数、计算原始输入的整数值。
  • 求最大值:将所有数字从大到小排序,按顺序逐位拼接即可。
  • 求最小值:将所有数字从小到大排序后,额外处理前导零问题——如果首位是0,找到第一个非0的最小数字和首位交换,再逐位拼接,避免出现0开头的无效整数。
  • 输出最大值、最小值、原始值以及二者的差值即可。
可运行修正代码
#include <stdio.h>
#include <string.h>

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    char input[100];
    int digits[100], temp_digits[100], count = 0;
    long long original = 0, max = 0, min = 0;
    int i, j;

    printf("Enter a number : ");
    scanf("%s", input);

    // 转换字符为数字位,计算原始值
    for (i = 0; input[i] != '\0'; i++) {
        if (input[i] >= '0' && input[i] <= '9') {
            digits[count] = input[i] - '0';
            original = original * 10 + digits[count];
            count++;
        }
    }

    // 降序排序拼最大值
    memcpy(temp_digits, digits, sizeof(int)*count);
    for (i = 0; i < count - 1; i++) {
        for (j = 0; j < count - 1 - i; j++) {
            if (temp_digits[j] < temp_digits[j+1]) {
                swap(&temp_digits[j], &temp_digits[j+1]);
            }
        }
    }
    for (i = 0; i < count; i++) {
        max = max * 10 + temp_digits[i];
    }

    // 升序排序,处理前导零后拼最小值
    memcpy(temp_digits, digits, sizeof(int)*count);
    for (i = 0; i < count - 1; i++) {
        for (j = 0; j < count - 1 - i; j++) {
            if (temp_digits[j] > temp_digits[j+1]) {
                swap(&temp_digits[j], &temp_digits[j+1]);
            }
        }
    }
    if (temp_digits[0] == 0) {
        for (i = 1; i < count; i++) {
            if (temp_digits[i] != 0) {
                swap(&temp_digits[0], &temp_digits[i]);
                break;
            }
        }
    }
    for (i = 0; i < count; i++) {
        min = min * 10 + temp_digits[i];
    }

    printf("The difference between largest(%lld) and smallest(%lld) of the integer %lld is %lld.\n", max, min, original, max - min);
    return 0;
}
测试验证
  • 输入样例3859428,降序排序后数字为9、8、8、5、4、3、2,拼接得到最大值9885432;升序排序后数字为2、3、4、5、8、8、9,拼接得到最小值2345889,完全符合预期。
  • 针对含0的输入比如1002,最大值输出2100,最小值不会出现0012的错误结果,而是正确输出1002。
  • 存储数值使用long long类型,相比int支持更大的数值范围,减少位数较多时的溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:27:51