问题:最大的数和最小的数
问题:最大的数和最小的数
问题描述:
输入一个多位数(小于100位),然后将其重新组合产生最大的数和最小的数。
输入格式
输入一个多位数
输出格式
分两行输出:
第一行输出重新组合产生的最大数;
第二行输出重新组合产生的最小数。
输入样例
2845
输出样例
Max:8542
Min:2458
代码
#include <stdio.h>
#include <string.h>
int Partition(int a[], int s, int t) { //划分算法
int i = s, j = t;
int tmp = a[s];
while (i != j) {
while (j > i && a[j] >= tmp)
j--;
a[i] = a[j];
while (i < j && a[i] <= tmp)
i++;
a[j] = a[i];
}
a[i] = tmp;
return i;
}
void QuickSort(int a[], int s, int t) { //对a[s,t]进行递增排序
if (s < t) {
int i = Partition(a, s, t);
QuickSort(a, s, i - 1);
QuickSort(a, i + 1, t);
}
}
int main() {
char n[100]; //定义字符数组接收输入的多位数
gets(n); //输入数字
int length; //length用来表示数字的长度
length = strlen(n);
int a[length]; //创建数字数组a[]来存放每个数字的值
for (int i = 0; i < length; i++) {
a[i] = n[i] - '0';
}
//对a[i]进行排序
QuickSort(a, 0, length - 1); //快排(从小到大排序)
//第一行输出重新组合产生的最大数;
printf("Max:");
for (int i = length - 1; i >= 0; i--) {
printf("%d", a[i]);
}
printf("\n");
//第二行输出重新组合产生的最小数;
printf("Min:");
int tmp = 0; //tmp用来保存第一个不为零的数字的位置
while (a[tmp] == 0) {
tmp++;
}
printf("%d", a[tmp]); //输出第一个不为零的数字,第一个数字不能为零否则输出的多位数数字长度会减小
for (int i = 0; i < length; i++) { //输出,若遇到第一个不为零的数字则跳过此数,去输出下一个数字
if (i == tmp) {
i++;
}
printf("%d", a[i]);
}
return 0;
}