键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数。对给于定的N和S,寻找一种方案使得剩下的数字组成的新数最小。c语言实现
时间: 2023-08-20 09:13:00 浏览: 59
以下是C语言实现:
```c
#include <stdio.h>
#include <string.h>
#define MAXN 1005
char num[MAXN], ans[MAXN];
int n, s;
void find_min(int pos, int cnt) {
if (cnt == s) { // 剩余数字个数已达到要求
ans[pos] = '\0';
printf("%s\n", ans);
return;
}
if (pos == n) { // 已经遍历完整个数字串
return;
}
int min_idx = pos;
for (int i = pos; i < n && i <= pos + s - cnt; i++) {
if (num[i] < num[min_idx]) { // 找到当前位置后最小的数字
min_idx = i;
}
}
ans[pos] = num[min_idx];
find_min(pos + 1, cnt); // 不删当前数字
find_min(min_idx + 1, cnt + 1); // 删当前数字
}
int main() {
scanf("%s%d", num, &s);
n = strlen(num);
find_min(0, 0);
return 0;
}
```
首先读入数字串和要删除的数字个数S,然后调用`find_min`函数寻找剩下数字组成的最小数。
`find_min`函数中,`pos`表示当前搜索到的位置,`cnt`表示已经删除的数字个数。如果`cnt`等于S,说明已经删除了足够的数字,可以输出答案并返回。如果`pos`等于n,说明已经遍历完整个数字串,可以直接返回。
然后在从`pos`到`pos+s-cnt`的范围内找到最小的数字,记录其位置`min_idx`,并将其加入答案串中。接着,分别递归搜索删除当前数字和不删除当前数字两种情况,搜索过程中需要分别将`pos`和`cnt`更新为下一层递归的值。
时间复杂度为O(n*(n-s)),其中n为数字串长度。