例30 删数问题
问题描述
从键盘输入一个高精度正整数num(num不超过250位),任意去掉S个数字后剩下的数字按原先后次序将组成一个新的正整数。编写一个程序,对给定的num和s,寻找一种方案,使得剩下的数字组成的新数最小。
输入格式
num (高精度的正整数)和S(需要删除的数字个数)。
输出格式
最后剩下的最小数。
输入样例
51428397
5
输出样例
123
(1)编程思路。
由于键盘输入的是一个高精度正整数num(num不超过250位),因此用字符串数组来进行存储。
为了尽可能地逼近目标,选取的贪心策略为:每一步总是选择一个使剩下的数最小的数字删去,即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字,否则删除第一个递减区间的首字符。然后回到串首,按上述规则再删除下一个数字。重复以上过程s次,剩下的数字串便是问题的解了。
也就是说,删数问题采用贪心算法求解时,采用最近下降点优先的贪心策略:即x1
另外,按这个方法删除s位后,要注意去掉结果中可能存在的前导0。
(2)源程序。
#include
#include
int main()
{
char num[251]={'\0'};
int s,i,j;
scanf("%s",num);
scanf("%d",&s);
while (s>0) // 循环s次,每次删除一个数字
{
i=0; // 每次删除后从头开始搜寻待删除数字
while (num[i]!='\0' && num[i]<=num[i+1])
i++;
for(j=i;j
num[j]=num[j+1]; // 将位置i处的数字删除
s--;
}
i=0;
while(num[i]=='0') i++; //处理前导0
if (num[i]=='\0') printf("0\n");
else printf("%s\n",