mioj移除k位最小

版权声明: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.
.
.在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35619728/article/details/89489293
今日推荐