1、c语言版
#include<cstdio>
#include<cstring>
char s[12];
int main()
{
int n;
scanf("%d",&n);
for(int q=0;q<n;q++)
{
int k;
scanf("%s",s);
scanf("%d",&k);
int len=strlen(s);
while(k--)//当k为零时,表示数已删够k位,跳出循环
{
for(int i=0;i<len;i++)
if(s[i]>s[i+1])
{
for(int j=i;j<len;j++)
s[j]=s[j+1];
break;//当一个“山峰”删过之后记得break,否则……自己试试吧
}
len--;//既然删了一个数,长度肯定要减少
}
while(s[0]=='0')//删除前导0(我方法很笨,不要在意)
{
for(int i=0;i<len;i++)
s[i]=s[i+1];
len--;
}
if(s[0]==0)//处理删到没有(全是“\0”)的情况
printf("0\n");
else
printf("%s\n",s);
}
return 0;
}
2、c++版
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
using namespace std;
int main()
{
//string n;
char n[12];
int t;
cin>>t;
while(t--)
{
int k;
cin>>n>>k;
//int len=n.length(); //string字符串的长度
int len =strlen(n); //char字符数组的长度
while(k--)
{
for(int i=0;i<len-1;i++)//len-1,防止越界问题,下面有n[i+1]
{
if((n[i]-'0')>(n[i+1])-'0')
{
for(int j=i;j<len-1;j++)//len-1,防止越界问题,下面有n[i+1]
{
n[j]=n[j+1];
}
break;
}
}
len--;
}
while(n[0]=='0')//删除前导0(我方法很笨,不要在意)
{
for(int i=0;i<len-1;i++)
n[i]=n[i+1];
len--;
}
if(n[0]==0)//处理删到没有(全是“\0”)的情况
cout<<0<<endl;
else
for(int x=0;x<len;x++)
{
cout<<n[x];
}
cout<<endl;
}
return 0;
}
3、进阶版
#include<iostream>
using namespace std;
int k;
main()
{
int t;
cin>>t;
while(t--)
{
string n; //定义字符串n
cin>>n>>k;
int len=n.size(); //也可以用n.length()来取字符串n的长度
while(k--)
for(int i=0;i<len;i++) //枚举
if(n[i]>n[i+1]||i==len-1) //删除遇到的第一个递减序列的第一个数字(若整个字符串为非递减序列,则删去末尾的数字)
{
n.erase(i,1); //把当前字符从字符串中删除
break; //不可省略,否则字符串会多删字符
}
while(n[0]=='0'&&n[1]) //去掉前缀0,并至少保留1个数字
n.erase(0,1); //删去当前字符串开头的'0'
cout<<n<<endl; //输出字符串
}
}