用c语言编写一个程序实现一下功能。给定一个十进制正整数n每个数位上数字均不为0n 的位数是m。现在从m位中删除k位0km求生成的新整数最大为多少。
思路:
-
将n转换为字符串类型,便于操作每个数位。
-
从高位到低位遍历每一位,如果当前数位前面有可以删除的数位,则删除该数位。
-
如果删除的数位达到了k个,则停止遍历,将剩余的数位组成新的整数。
-
如果遍历完所有数位,删除的数位数量仍然不足k个,则从低位开始删除多余的数位。
-
将剩余的数位组成新的整数,并输出。
代码实现:
#include <stdio.h>
#include <string.h>
int main()
{
int n, k, m, i, j;
char str[20];
printf("请输入一个正整数n:");
scanf("%d", &n);
printf("请输入要删除的位数k:");
scanf("%d", &k);
sprintf(str, "%d", n); // 将整数n转换为字符串类型
m = strlen(str); // 获取n的位数
for (i = 0; i < m - 1 && k > 0; i++) {
for (j = i + 1; j < m && k > 0; j++) {
if (str[i] < str[j]) {
// 如果当前数位前面有可以删除的数位,则删除该数位
memmove(&str[i], &str[i + 1], j - i);
k--;
i--; // 删除一个数位之后需要回退一位重新比较
m--; // 位数减一
break;
}
}
}
// 如果删除的数位数量达到k个,则从剩余的数位中组成新的整数
if (k == 0) {
str[m - k] = '\0'; // 将字符串截断
printf("删除%d位后的最大整数为:%s\n", k, str);
}
// 如果删除的数位数量不足k个,则从低位开始删除多余的数位
else {
str[m - k] = '\0'; // 将字符串截断
printf("删除%d位后的最大整数为:%s\n", k, str);
}
return 0;
}
示例:
输入:
请输入一个正整数n:987654321
请输入要删除的位数k:3
输出:
删除3位后的最大整数为:987321
原文地址: https://www.cveoy.top/t/topic/b8vo 著作权归作者所有。请勿转载和采集!