把问题转化一下,现在我们把问题转化下,把删掉n位数,看成保留 长度-n 位数这样我们直接每次选最小的就行了(用字符串保存初始数据)。
比如53421 删除2位。那么就在前3位也就是(534)中找最小值(ps:这里为什么要从前3位找呢?因为删两位所以要保留3位在前3位中找就算找到了第3位后面也还有两位可以保证最后存在3个数字)现在我们找到了其中的第2位数字3.然后从3的下一位也就是4开始找,现在在(42)中找最小,找到2,最后从2后面为找。此时只剩一位数了最后当然是1了;
给点数据你们理解下
478531 4//先在478中找到4,然后在785中找到了5,然后在3中找到了3,然后在1中找1;
4531
45781 3 //先在4578中找到4,然后在5781中找到1
41
45817 3//先在4581中找到1,然后在7中找到7
17
原理是一个整数位数越高的数取的越小整个数就越小。。。。这个能理解吧。。。
关于这个东西可能出现450781 3这种数据这件事
这个数据的结果是71.。。。
原数应该是071,但是提示说不输出前导0
下面上代码
#include <stdio.h>
#include <string.h>
int main()
{
char c[105];//输入原数字符保存
int n;
scanf("%s",c);
scanf("%d",&n);
int len = strlen(c);
n = len - n;//把删掉n位转化为保留len-n位
int mark = 0;//表示从mark开始。。是为了上面说的的找到一位后从这一位的下一位开始找下一个。
int lo = 0;//表示是否输出了数字。主要为了不输出前导0
while(n>0)//当n==0时表示要保留的数找完了,就退出循环
{
int mi = mark;
for(int f = mark;f <= len - n; f++)
if(c[mi]>c[f]) mi = f;
mark = mi + 1;
if(c[mi]!='0') lo = 1;//如果找到的数不为0那么说明没有前导0或者被排除了;
if(lo==1) printf("%c",c[mi]);
n--;
}
printf("\n");
}