本关的编程任务是补全右侧代码片段main中Begin至End中间的代码,具体要求如下: 在main中,读取大整数字符串并存入字符数组s,然后将字符数组s转换到整型数组a中。读取整数k(表示要删除k个数字),然后根据贪心策略,求解出删除k个数字后剩下的最大整数,并在一行输出。 测试说明 平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。 以下是平台的测试样例: 测试输入: 79502867154829179316 8 预期输出: 987829179316
时间: 2024-02-27 10:52:18 浏览: 142
下面是代码实现:
```c
#include <stdio.h>
#include <string.h>
#define maxn 100010
char s[maxn];
int a[maxn];
int main()
{
scanf("%s", s);
int n = strlen(s);
int k;
scanf("%d", &k);
for (int i = 0; i < n; i++) a[i] = s[i] - '0'; // 将字符数组转换为整型数组
for (int i = 1; i < n && k; i++) // 贪心策略,从第二位开始,如果前一位比当前位大,就删除前一位
{
if (a[i - 1] > a[i])
{
a[i - 1] = -1; // 标记此位应该删除
k--;
}
}
// 如果还有剩余的k,表示前面的数都是递增的,从后往前删除k个数即可
for (int i = n - 1; k && i >= 0; i--)
{
if (a[i] != -1)
{
a[i] = -1; // 标记此位应该删除
k--;
}
}
// 将整型数组转换为字符数组,输出剩下的最大整数
int flag = 0;
for (int i = 0; i < n; i++)
{
if (a[i] == -1) continue;
if (flag || a[i]) // 去掉前导零
{
printf("%d", a[i]);
flag = 1;
}
}
if (!flag) printf("0"); // 如果所有位都被删除,输出0
return 0;
}
```
这个程序先将字符数组转换为整型数组,然后从第二位开始,如果前一位比当前位大,就删除前一位,直到删除k个数或者前面的数都是递增的;如果还有剩余的k,表示前面的数都是递增的,从后往前删除k个数即可。最后将整型数组转换为字符数组,输出剩下的最大整数。
阅读全文