版权声明:spark https://blog.csdn.net/qq_35619728/article/details/89489293
小米oj
移除k位最小
描述
有一行由 N 个数字组成的数字字符串,字符串所表示的数是一正整数。移除字符串中的 K 个数字,使剩下的数字是所有可能中最小的。
假设:
字符串的长度一定大于等于 K
字符串不会以 0 开头
输入
一行由 N 个数字组成的数字字符串(0 < N < 20),和一个正整数 K(K < N),两个数据由空格隔开,如:1432219 3。
输出
移除 K 位后可能的最小的数字字符串。 如 1432219 移除 4, 3, 2 这 3 个数字后得到 1219,为所有可能中的最小值。
这个题相对来说比较简单。。。。。。。。。。先是读出来然后。。。。。从最高位开始,针对每一个位做一个判断,看这个位能不能被删除,如果可以就删并且更新剩余可以删除的位数(程序中用a来表示这个参数)
最后再把输出字符前面的0都给删掉就好了。。。。。。。。。。。。。。。。。。。。。。。。这个地方有个坑。。。所有数字都是0剩下的也是0不能全删掉,最后还要输出0.。。。。。
比如1234567890 0这种组合。。。
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <ctype.h>
int main()
{
char str1[20],spark[20];
static int a,len,leave,i,j,k,flag,gggg;//零时中转
char line[1000];
scanf("%s %d",str1,&a);//a为
//printf("%s\n", str1);
len = strlen(str1);
for (i = 0; i <=len; i++)
{
flag = 0;
for (j = 1; j < a+1; j++)//a位前位向后看
{
if (str1[i] > str1[i + j])
flag = 1;
}
if (flag == 1)
{
str1[i] = '0';
a--;
}
//printf("%d\n", a);
else
spark[k++] = str1[i];
}
len = strlen(spark);
int count = 0;
for (i = 0; i < len; i++)
{
if (spark[i] == '0')
count++;
}
if (count == len)
{
printf("0");
return 0;
}
for (i = 0; i < len; i++)
{
if (spark[i] == '0')
// gggg = 1;
;
else gggg = 2;
if (gggg == 2)
printf("%c",spark[i]);
}
//printf("%d\n", a);
//printf("%s\n", str1);
system("pause");
return 0;
}
这里的#pragma warning(disable:4996)可以屏蔽掉vs 使用scanf_s的规则。。。。。。。然后system(“pause”)可以让程序执行完后看结果。。方便调试。。。。。。。。。
。。。。
。
。
。
。
。
。
。
。
over.
.
.