单点时限: 2.0 sec
内存限制: 256 MB
“非下降数”表示一个整数的高位数码不会大于低位数码。
如11123345,111是“非下降数”,121,11123343不是“非下降数”。
现在给定一个整数 n (1≤n≤1018),找出不大于 n 的最大“非下降数”。
输入格式
第 1 行:整数T(1≤T≤100)为问题数。
第2行:第一个问题的数据n。
第3∽T+1行:后面问题的数据,格式与第一个问题相同。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等),然后在每一行中输出找到的那个数。
样例
input
3
1
1000
111111111111111110
output
case #0:
1
case #1:
999
case #2:
99999999999999999
/*
思路:找到不满足的位,此位之前的那个数减一,后面均为9就是满足最大的那个数,eg:2331 2299。但是此位之前的那个数可能是1,减1之后就不会满足了,此时最大的那个数是首位减一,其余位为9。eg:34110 满足最大的数为 29999
*/
#include<iostream>
using namespace std;
int main() {
int t;
cin>>t;
for(int i = 0; i < t; i++) {
string s;
cin>>s;
printf("case #%d:\n",i);
int j = 1;
for(; j < s.size(); j++) {
if(s[j]<s[j-1])
break;
}
if(j==s.size())
cout<<s<<endl;//1121 1111 1120 1111 2110 1111
else {
if(s[j-1]=='1') {
if(s[0]!='1')
cout<<s[0]-'1';
for(int z=0; z<s.size()-1; z++)
cout<<9;
cout<<endl;
} else {
int z=j-1;
while(s[z]==s[z-1]&&z>0)z--;//44440 12331 12222
if(z==0) {
if(s[0]!='1')
cout<<s[0]-'1';
for(int k=0; k<s.size()-1; k++)
cout<<9;
cout<<endl;
} else {
s[z]--;
for(int k=0; k<=z; k++)
cout<<s[k];
for(int k =z+1; k<s.size(); k++)
cout<<9;
cout<<endl;
}
}
}
}
return 0;
}
/*
当然也可以从后往前找,找到一个不满足就将此位数减一,之后位为9
*/
#include <bits/stdc++.h>
using namespace std;
void solve(string &s) {
for(int i=s.size()-2; i>=0; i--) {
if(s[i]>s[i+1]) {
s[i]--;
for(int j=i+1; j<s.size(); j++) {
s[j]='9';
}
}
}
}
int main() {
int cas;
cin>>cas;
for(int i=0; i<cas; i++) {
string s;
cin>>s;
printf("case #%d:\n",i);
solve(s);
bool ok=0;
for(int i=0; i<s.size(); i++) {
if(s[i]!='0')
ok=1;
if(ok==1)
cout<<s[i];
}
cout<<endl;
}
return 0;
}