题目 alt

输入 alt

输出 alt

思路 为了使折叠数最大,所以我们选取的数肯定要接近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;
	}
	
}