描述
给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456
输入第一行t, 表示有t组数据;
接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。输出t行,每行一个数字,表示从n中删除k位后得到的最小整数。样例输入
2 9128456 2 1444 3
样例输出
12456 1
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[10]; 6 int b[11],len,i,t,k,p,q; 7 scanf("%d",&t); 8 while(t--) 9 { 10 memset(b,-1,sizeof(b)); 11 scanf("%s %d",a,&k); 12 len=strlen(a); 13 for(i=1;i<=len;i++) 14 b[i]=a[i-1]-‘0‘; 15 for(p=1;p<=k;p++) 16 for(i=1;i<=len;i++) 17 { 18 if(i==len) 19 { 20 len--; 21 break; 22 } 23 if(b[i]>b[i+1]) 24 { 25 for(q=i;q<len;q++) 26 b[q]=b[q+1]; 27 len--; 28 break; 29 } 30 } 31 for(i=1;i<=len;i++) 32 if(b[i]>0) 33 printf("%d",b[i]); 34 printf("\n"); 35 } 36 return 0; 37 }
1 //这个程序栈溢出,仅供参考 2 #include<stdio.h> 3 #include<string.h> 4 int b[11]; 5 int i,j,mi,min; 6 void m(int s,int z,int k) 7 { 8 if(k==0) return ; 9 else 10 { 11 min=10; 12 for(i=s;i<=z;i++) 13 if(b[i]<min&&b[i]!=-1) 14 { 15 mi=i;min=b[i]; 16 } 17 if(mi-s<=k) 18 { 19 for(i=s;i<mi;i++) 20 b[i]=-1; 21 m(mi+1,z,k-mi+s); 22 } 23 else 24 m(s,mi-1,k); 25 } 26 } 27 int main() 28 { 29 char a[10]; 30 int k,la,t; 31 scanf("%d",&t); 32 while(t) 33 { 34 memset(b,-1,sizeof(b)); 35 scanf("%s %d",a,&k); 36 la=strlen(a); 37 for(i=0;i<la;i++) 38 b[i+1]=a[i]-‘0‘; 39 m(1,la,k); 40 for(i=1;i<=la;i++) 41 if(b[i]!=-1) printf("%d",b[i]); 42 printf("\n"); 43 t--; 44 } 45 }
时间: 2024-10-18 03:17:26