组个最小数:给定数字0~9各若干个,可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位) 。C语言
时间: 2023-11-20 16:57:49 浏览: 177
这道题可以使用贪心算法来解决。具体思路是从最高位开始,每次选择当前可用数字中最小的一个,直到所有数字都被使用完毕。需要注意的是,0不能作为首位数字,因此需要特判一下。
以下是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main(void) {
int p[N];
char *sum;
int i, j, count = 0;
for (i = 0; i < N; i++) {
scanf("%d", &p[i]);
count += p[i];
}
sum = malloc(sizeof(char) * count);
for (i = 0; i < count; i++) {
for (j = 0; j < N; j++) {
if (j == 0 && i == 0) // 0不能作为起始数字,所以直接continue
continue;
if (p[j] != 0) { // 把数字转换成字符串,没处理完一位数,break。每次都从低位数开始,所以排列的数字会是最小的。
*sum++ = j + '0';
p[j]--;
break;
}
}
}
*sum = '\0'; // 注意字符串结尾需要加上'\0'
printf("%s", sum - count); // sum要回溯
return 0;
}
```
阅读全文