一、问题描述
键盘输入一个高精度的正整数n(<=240位),去掉任意k个数字后剩下的数字按原左右次序将组成一个新的正整数。
编程对给定的n和k,寻找一种方案,使得剩下的数最小。
Simple Input
178543
4
Simple Output
13
二、算法分析:
要使删除后的数最小,则从高位到低位开始删除,若各位数字为递增,则删除最后一个数字,否则删除第一个递减区间的第一个数,删除后形成新的数字穿,再对此数字串进行以上操作,直到删除k个数为止。
比如:2315679 k=4
第一次:第一个递减区间31,删除3,得到215679
第二次:第一个递减区间为21,删除2,得到15679
第三次:数字串为递增,删除最后一个数9,得到1567
第四次:数字串为递增,删除最后一个数7,得到156
#include<stdio.h>
#include<string.h>
char s[500],temp[500];
int main()
{
int k,num=0;
scanf("%s %d",s,&k);
int n=strlen(s);
int j;
while(num<k)
{
int i;
// printf("%s\n",s);
for(i=0; i<n-num; i++)
{
if(s[i]>s[i+1])///第一个递减区间
{
j=i+1;
break;
}
else
temp[i]=s[i];///数字串递增,复制给temp
}
for(; j<n-num; j++)///跳过第一个递增区间的第一个元素复制
temp[i++]=s[j];
num++;/// 若是数字串为递增num++时n-num判断时相当于删除了最后一个元素
memset(s,'\0',sizeof(s));
strcpy(s,temp);///此时s为删除后的数字串
memset(temp,'\0',sizeof(temp));
}
printf("%s\n",s);
return 0;
}