c++算法设计与分析——删数问题

给定一个高精度正整数a, 去掉其中k个数字后按原左右次序将组成一个新的正整数。对给定的a, k寻找一种方案,使得剩下的数字组成的新数最小。
解:应用贪心算法设计求解
(1) 设计要点
操作对象为n位高精度数,存储在数组a中。
在整数的位数固定的前提下,让高位的数字尽量小,整数的值就小。这就是所要选取的贪心策略。
每次删除一个数字,选择一个使剩下的数最小的数字作为删除对象。
当k=1时,对于n位数构成的数删除哪一位,使得剩下的数据最小。删除满足如下条件的a[i]:它是第一个a[i]>a[i+1]的数,如果不存在则删除a[n](最后一位数字,具体实现时请注意下标表示方法)。
当k>1(当然小于n),按上述操作一个一个删除。每删除一个数字后,后面的数字向前移位。删除一个达到最小后,再从头开始,删除第2个,依此分解为k次完成。
若删除不到k个后已无左边大于右边的降序或相等,则停止删除操作,打印剩下串的左边n-k个数字即可(相当于删除了若干个最右边的数字)

#include
using namespace std;
void tanxin(char c[100],int k,int i)
{

	int j,t;
	if(k==1)
	{
		for(j=0;j<i;j++)
			if(c[j]>c[j+1])
			{
				for(t=0;t<i;t++)
					if(t!=j)
						cout<<c[t];
				cout<<endl;
				break;
			}
		if(j-i==1)
		{
			for(t=0;t<i-1;t++)
				cout<<c[t];	
			cout<<endl;
		}
	}
	else
	{
		for(j=0;j<i;j++)
			if(c[j]>c[j+1])
			{
				for(t=j;t<i;t++)
					c[t]=c[t+1];
				tanxin(c,--k,--i);
				break;
			}
		if(j-i==1)
			tanxin(c,--k,--i);
	}
}
int main()
{
	int a,k,i=0,j;
	char b[100],c[100];
	cout<<"请输入正整数a以及需要删除的位数k"<<endl;
	cin>>a>>k;
	while(a)
	{
		b[i]=char(a%10+48);
		a=a/10;
		i++;
	}
	for(j=0;j<=i;j++)
		c[j]=b[i-j-1];
	tanxin(c,k,i);
	return 0;
}

c++算法设计与分析——删数问题_第1张图片

你可能感兴趣的:(课后作业答案)