用C++写一个程序使其从键盘输入一个高精度正整数n,任意去掉s个数字,把剩下的数字组合成一个新的正整数,次序不变且剩下的数字组成的新数最小。
时间: 2023-06-04 18:08:09 浏览: 156
基于C++,编写一个程序求一组正整数的模 适合新手
好的,我可以帮你解决这个问题。
首先,我们需要将输入的数字n转换成字符串,方便进行操作。然后,我们可以使用贪心算法来求解,具体步骤如下:
1. 遍历字符串n,找到第一个比后面数字大的数字,记录下位置i。
2. 如果找不到这样的数字,说明该数字已经是最小的了,直接返回。
3. 否则,我们需要删掉一个数字。我们可以从i-1往前找,找到第一个比n[i]小的数字,将其删除,并将i向前移动一位。如果这样找不到,我们就删除n[i]。
4. 如果已经删除了s个数字,或者已经遍历了所有数字,我们就返回剩余的数字即为答案。
以下是C语言代码实现:
```
#include <stdio.h>
#include <string.h>
void removeDigits(char *n, int s) {
int len = strlen(n);
int i, j;
for (i = 0; i < s; i++) {
// 找到第一个比后面数字大的数字
for (j = 0; j < len - 1; j++) {
if (n[j] > n[j+1]) {
break;
}
}
if (j == len - 1) { // 如果没找到,说明已经最小
break;
}
// 找到第一个比n[j]小的数字
int k = j - 1;
while (k >= 0 && n[k] >= n[j]) {
k--;
}
// 删掉数字
if (k < 0) {
for (k = j; k < len - 1; k++) {
n[k] = n[k+1];
}
n[k] = '\0';
len--;
} else {
for (int l = k + 1; l < len - 1; l++) {
n[l] = n[l+1];
}
n[len - 1] = '\0';
len--;
j = k + 1;
}
}
printf("%s\n", n);
}
int main() {
int s;
char n[100];
scanf("%s %d", n, &s);
removeDigits(n, s);
return 0;
}
```
希望能够解决你的问题。
阅读全文