Time Limit:1000MS Memory Limit:65536K
Total Submit:485 Accepted:158
Language: not limited
Description
问题描述:
给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列成一个新的正整数。
算法设计:
给定n (1<=n<=200)位的正整数a和k,此时,k小于n。
试着设计一个算法,找出删去k个数,剩下数字组成的新数最小的删数方案。
Input
可输入多组测试数据,每组测试数据分两行,每行一个数,数的含义如下。
第一行:正整数a(a是大于0的一个n位正整数)
第二行:正整数k
以0来结束测试数据。
Output
输出每组测试数据所得出的删k位数之后的最小数。
若输出的数首位是0,无须理会,0也直接输出即可。例如:024,就直接输出024,无须改成24。
Sample Input
178543 4 87654321 2 123456789 1 254193 1 90249 2 0
Sample Output
13 654321 12345678 24193 024
Hint
按高位到低位的方向搜索递减区间,考虑递减区间的首字符。
Source
Provider
root
/*呃。。还是手痒。。。又忍不住要写代码了。*/ /*其实这一题也没有什么好说的,按照hint来做就对.*/ /*不过木有想到的是,竟然一次就写好了,无需修改,无需调试。。。*/ /*不过,效率还是不够高,要1MS*/ #include<stdio.h> #include<string.h> int main(void) { int t = 0 ; int i = 0 ; int j = 0 ; int n = 0 ; int StrLen = 0 ; int DelNum = 0 ; char istr[201] ; int k = 0 ; while((gets(istr) != NULL) && istr[0] != '0') { scanf("%d",&DelNum) ; getchar() ; StrLen = strlen(istr) ; for(i = 0 ; i < DelNum ; i++) { for(j = 0 ; j < StrLen ; j++) { if(istr[j] > istr[j+1]) { for(k = j ; k < StrLen ; k++) { istr[k] = istr[k+1] ; } //end of for break ; } // end of if } // end of for if(j == StrLen) { istr[j-1] = '/0' ; } StrLen-- ; } // end of for puts(istr) ; } return 0 ; }