題意:
給你一個數n,求位數和比n的位數和大一的且與n最接近的的比n小的數。
思路:
見註釋
#include <bits/stdc++.h>
using namespace std;
string s,ss;
const int maxn = 1e5+10;
const int inf =0x3f3f3f3f;
int a[maxn];
bool judge(int index)
{
if(a[index] < 2)
return 0 ;
ss = s;
int cnt = 2;//一共要加2
ss[index] -=1;//當前位置減1
for(int i = index + 1; i < ss.size() && cnt && a[index]>=2; i++)
{
if(ss[i] == '8')
{
ss[i] += 1;
cnt--;
}
else if(ss[i] <'8')
{
if(cnt == 2)
{
cnt-=2;
ss[i]+=2;
}
else
{
cnt-=1;
ss[i]+=1;
}
}
}
if(cnt == 0)
return 1;
return 0;
}
int main()
{
ios::sync_with_stdio(0);
while(cin>>s && s!= "END")
{
int index = inf;
int flag = 0;
int f = -1;
memset(a,0,sizeof a);
if(s[0] != '-')//輸入是正數
{
int len = s.size();
a[len-1] = '9' - s[len-1] ;
if(s[len-1] < '9')
index = len-1;
for(int i = len- 2; i >= 0; i--)
{
a[i] = a[i+1];//後綴和
if(s[i] >= '1')//當前可以減1,然後判斷往後的數可不可以加2
{
if(judge(i))
{
s = ss;
flag = 1;
f = i;
break;
}
}
a[i] += ('9' - s[i]) ;
if(s[i] < '9' && index == inf)
index = i;
}
if(flag == 1)
{
int sum = 0;
if(s[0] == '0')//如果首位減爲0,說明,總位數減小,那麼,優先輸出9就是
{
for(int i = 0; i < len; i++)
{
sum += s[i]-'0';
}
int l = len-1;
while(l--)
{
if(sum >= 9)
{
cout<<9;
sum-=9;
}
else if (sum < 9 && sum > 0)
{
cout<<sum;
sum = 0;
}
else
cout<<0;
}
cout<<endl;
}
else
{
for(int i = 0; i <=f; i++)//先輸出前幾位沒變的
cout<<s[i];
int sum = 0;
int l = len - f -1;
for(int i = f+1; i < len; i++ )
sum+=s[i]-'0';
while(l--)
{
if(sum >= 9)
{
cout<<9;
sum-=9;
}
else if(sum >0)
{
cout<<sum ;
sum = 0;
}
else
cout<<0;
}
cout<<endl;
}
continue;
}
else//如果沒辦法通過減1加2來進行變換,那麼變爲負數,在最靠右的位置加1,如果全是9,那麼增加一位
{
int sum = 0;
if(index != inf)
{
s[index] += 1;
flag = 1;
}
if(flag)
{
cout<<'-';
cout<<s<<endl;
continue;
}
else
{
cout<<-1;
cout<<s<<endl;
continue;
}
}
}
else//負數簡單點,加一即可
{
for(int i = s.size()- 1; i>=1; i--)
{
if(s[i] < '9')
{
s[i]+=1;
flag = 1;
break;
}
}
if(flag )
cout<<s<<endl;
else
{
cout<<-1;
for(int i = 1; i < s.size(); i++)
cout<<s[i];
cout<<endl;
}
}
}
return 0;
}