删数问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入有多组 每组包括原始数n,要去掉的数字数s;
Output
输出去掉s个数后最小的数
Sample Input
178543 4
Sample Output
13
Hint
Source
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
char a[101];
int main()
{
int s,i,len;
while(~scanf("%s%d",a,&s))
{
len=strlen(a);
while(s--)
{ i=0;
while(i<len&&a[i]<=a[i+1]) i++;
while(i<len)
{
a[i]=a[i+1];//最后一个的时候是'\0'补过来,但是len的长度不包括'\0',但是i是永远比len小1的
i++;
}//这边i每一次都比len小1,所以每次都会减一个,刚好减s个
}
len=strlen(a);//这个地方的len要进行重置,因为a有删除的部分,所以长度是改变了的
while(len>1&&a[0]=='0')
{
for(i=0;i<len;i++)
{
a[i]=a[i+1];
}
len--;
}//这个地方分2种情况,一种是都为0,那么限制条件就是len>1,另一种情况就是不全为0,这时候就要看a[0]是不是0进行判断
printf("%s\n",a);
}
return 0;
}
Think:
删数要从高位往低位删,并且如果是递增序列,那么就删除最后一个数,反之,如果出现了递减,就删除当前位;这个代码分两部分,一部分是进行删除判断的,另一部分是输出判断的(前置是否为0);