知道你想保持数字顺序肯定会让这个解决方案变得更加困难。
我同意IVlad 的观点,即char[]s 不是正确的选择。
我认为这是一个相当不错的解决方案:
#include <stdio.h>
#include <math.h>
#include <limits.h>
#define DIGITS_TO_REMOVE 3 // Assumed to be positive
int recurse(int* foo, int begin, int end, int previous, int max){
int i;
int min = begin;
for (i = begin; i <= end; ++i){
if (foo[min] > foo[i]){
min = i;
}
}
return previous * pow(10, max - end + 1) + (max > end ? recurse(foo, min + 1, end + 1, foo[min], max) : foo[min]);
}
int main(void) {
int foo[(const int)ceil(log10(INT_MAX))];
int bar = 24635; // Assumed to be larger than pow(10, DIGITS_TO_REMOVE) - 1
int size = ceil(log10(bar));
int i;
int min = size - DIGITS_TO_REMOVE;
for (i = 1; bar > 0; bar /= 10, ++i){
foo[size - i] = bar % 10;
if (i >= DIGITS_TO_REMOVE && foo[size - i] <= foo[min]){
min = size - i;
}
}
printf("%d", recurse(foo, min + 1, DIGITS_TO_REMOVE + 1, foo[min], size - 1));
return 0;
}
编辑:
IVlad 还建议我让解决方案返回一个数组,而不仅仅是一个 int,这样它就不会受到返回类型的大小的限制。显然,准备输入和输出数组需要做一些工作,因此这可能不是 OP 的目标,但这是一个有趣的问题。
#include <stdio.h>
#define DIGITS_TO_REMOVE 3 // Assumed to be positive
#define INPUT_SIZE 5 // Assumed to be greater than DIGITS_TO_REMOVE
void recurse(int* input, int* output, int begin, int end){
int i;
int min = begin;
for (i = begin; i < end; ++i){
if (input[min] > input[i]){
min = i;
}
}
output[end - DIGITS_TO_REMOVE - 1] = input[min];
if (end < INPUT_SIZE){
recurse(input, output, min + 1, end + 1);
}
}
int main(void) {
int foo[] = { 2, 4, 6, 3, 5 };
int bar[INPUT_SIZE - DIGITS_TO_REMOVE];
int i;
recurse(foo, bar, 0, DIGITS_TO_REMOVE + 1);
for (int i = 0; i < INPUT_SIZE - DIGITS_TO_REMOVE; ++i){
printf("%d", bar[i]);
}
return 0;
}