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
相关产品推荐
相关产品推荐

