用c语言求删除数的问题 键盘输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。(采用贪心算法)
时间: 2024-01-03 07:09:21 浏览: 97
可以采用贪心算法来解决删除数的问题。
具体思路是,从高位到低位,每次删除当前数位上的数字,如果能使得删除后的数字最小,则删除;否则保留当前数字,继续考虑下一位数字。
具体实现过程如下:
1. 将输入的正整数n转换成数组a,其中a[0]存储最高位,a[len-1]存储最低位。
2. 从高位到低位遍历数组a,每次删除当前数位上的数字,如果删除后的数字比原数字小,则删除;否则保留当前数字。
3. 删除s个数字后,将剩余的数字组成一个新的正整数。
4. 输出新的正整数。
C语言代码实现如下:
```c
#include <stdio.h>
#include <string.h>
#define MAX_DIGITS 1000
void remove_digits(int a[], int len, int s) {
int i = 0;
while (s > 0 && i < len) {
int j = i + 1;
while (j < len && a[j] >= a[i]) {
j++;
}
// 删除a[i]
for (int k = i; k < len - 1; k++) {
a[k] = a[k + 1];
}
len--;
s--;
i = j - 1;
}
}
void print_number(int a[], int len) {
int i = len - 1;
while (i >= 0 && a[i] == 0) {
i--;
}
if (i < 0) {
printf("0\n");
return;
}
while (i >= 0) {
printf("%d", a[i]);
i--;
}
printf("\n");
}
int main() {
char buffer[MAX_DIGITS + 1];
int a[MAX_DIGITS];
int len, s;
printf("Please input a positive integer: ");
fgets(buffer, MAX_DIGITS + 1, stdin);
len = strlen(buffer) - 1;
for (int i = 0; i < len; i++) {
a[i] = buffer[len - 1 - i] - '0';
}
printf("Please input the number of digits to remove: ");
scanf("%d", &s);
remove_digits(a, len, s);
print_number(a, len - s);
return 0;
}
```
测试样例:
```
Please input a positive integer: 31948
Please input the number of digits to remove: 2
134
```
阅读全文