本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
问题源地址:
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2072.html
Problem Description
键盘输入一个高精度的正整数n(≤100位),去掉其中任意s个数字后剩下的数字按照原来的左右次序组成一个新的正整数。编程对给定的n与s,寻找一种方案,使得剩下的数字组成的新数最小。
Input
输入有多组 每组包括原始数n,要去掉的数字数s;
Output
输出去掉s个数后最小的数
Example Input
178543 4
Example Output
13
My code
#include <stdio.h>
#include <string.h>
#define L 101
int main()
{
int i, j, k, m, n, t, c;
char ch[L], s;
while(~scanf("%s %d", ch, &n))
{
//从高位开始寻找递减区间的第一位并删除
//当整组数据无递减区间时,最后一位数字与字符串结尾的'\0'构成递减区间并被删除
while(n--)
{
m = strlen(ch);
for(i = 0; i < m; i++)
{
if(ch[i] > ch[i + 1])
{
for(j = i; ch[j] != 0; j++)
{
ch[j] = ch[j + 1];
}
break;
}
}
}
/************/
//输出时忽略第一位非零数字前的数字0
c = 0;
for(i = 0; ch[i] != 0; i++)
{
if(ch[i] != '0'||(ch[i] == '0'&&c))
{
printf("%c", ch[i]);
c++;
}
}
//当数组中所有非零数字均被删除时,输出"0"
if(c)
printf("\n");
else
printf("0\n");
}
return 0;
}
Hint
输出时注意对有效数字前的0的处理,以及全零串和空串的输出格式。