题目
输入
输出
思路 为了使折叠数最大,所以我们选取的数肯定要接近r,同时要保证所选取的数中9尽可能的多。
l=20
r=123456
那它最大折叠数就是999990。
l=123
r=123456
那它最大折叠数就是999221。
观察发现最大数就是从两者不同的位数减1,之后所以位数变为9。
存在一种特殊情况;
l=123
r=123999
那它就不需要减一,直接反转就行了。
实现
因为要用到reverse,所以要优先考虑前导零的情况,而对于所有前导零的情况,R=10000...是最特殊的所以优先处理;
同时为了方便处理,将l的长度和r统一。
完整代码
```#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int t;
cin>>t;
while(t--){
string L,R;
cin>>L>>R;
int l=stoll(L),r=stoll(R);
int n=R.size();
string t(1,'1');
for(int i=0;i<n-1;i++){
t+='0';
}
if(R==t){ //处理R=1000....
if(L==R){ //处理R=L=10000.......
cout<<1<<endl;
}
else{
int x=stoll(R); //处理R=1000..... L!=1000....
cout<<x-1<<endl;
}
continue;
}
if(L.size()<R.size()){
L=t;
}
string ans;
int k=-1;
for(int i=0;i<n;i++){
if(L[i]!=R[i]){
k=i;
break;
}
}
if(k==-1){ //处理R = L != 100.....
ans=L;
while(ans.size()>1&&ans.back()=='0'){
ans.pop_back();
}
reverse(ans.begin(),ans.end());
}
else{ //处理R != L != 100......
bool check=true;
for(int i=k+1;i<n;i++){
ans+='9';
check=check&&(R[i]=='9');
}
ans+=(R[k]-!check);
for(int i=k-1;i>=0;i--){
ans+=R[i];
}
}
cout<<ans<<endl;
}
}

京公网安备 11010502036488号