删数问题(C语言实现)

删数问题(C语言实现)

用到贪心算法贪心策略
删数问题 输入一个高精度的正整数n(≤200位),去掉其中任意k个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与k,寻找一种方案,使得剩下的数字组成的新数最小。
例如: 输入:178542
       3
   输出: 142
思路分析
想要删除之后的数字最小,我们需要用到贪心算法策略,先达到局部最优进而达到整体最优。

结合测试数据来说,在178542中删除第一个数字之后使他成为删掉一个数字之后的最小值,首先要知道这个数字原来是6位数,删掉一个数字之后使5位数,而在相同尾数下决定一个数字的大小的应该是先比较首位数字,进而比较第二位数字,然后下一位,以此类推。

所以当删除第一个数字的时候,主需要考虑是丢掉数组下标为0的还是下标为1的内容。为了方便进行处理,并不是直接输入一个数字,而是输入一个字符串数组。

结合测试数据,第一次需要去掉的数字是7,因为去掉1之后是78542, 去掉7之后是18542,只根据首位数字便可比较出大小。删掉比较小的数字后将其他下标的内容往前移动即可。

第二次及需要去掉的数字是8,可以将去掉1和去掉8之后的数字进行比较。

以此类推,直到数字长度达到要求。

下面是实现代码

#include <stdio.h>
int main()
{
	int i=0,j=0,n,k;
	char num[200]={'0'}, *p;
	printf("Please input the length of the number and the length that you want to delete\n");
	scanf("%d%d",&n,&k);
	getchar();
	p=num;
	printf("Please input the num\n");
	gets(num);

	for(j=0;j<k;++j)
	{
		if(num[0] < num[1])
			for(i=1;i<n;++i)
				num[i] = num[i+1];
		else
			for(i=0;i<n;++i)
				num[i] = num[i+1];
	}
	printf("Here are the results:\n");
	for(i=0;i<n-k;++i)
		printf("%c\n", num[i]);
	
	return 0;
}

易错提醒:
一开始并不是定义的char 类型数组,而是int 类型。
当输入完测试数据之后还要据需输入。
思考后发现因为我们输入的数字178542是连续输入的,所以程序会认为我们只输入了一个数字而已。如果要定义为int类型的数组,标准的输入应该是 1 7 8 5 4 2 , 中间需要加空格以表示数字的区分。但是定义为char类型则很方便数据的输入与表示。

发布了22 篇原创文章 · 获赞 39 · 访问量 4040

猜你喜欢

转载自blog.csdn.net/weixin_44895666/article/details/102526058