题解:P13729 【MGVOI R1-A】超级奇数(odd)
题干就简单概括一下:需要寻找一个数字
但是枚举加的
按位操作,分成两种情况:
- 当前位是偶数
- 当前位是奇数
对于第一种情况,我们将当前位加一,使其变为奇数。由于我们要寻找最小的
int Nxt = Nownum + 1;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;
对于第二种情况,我们先进行尝试构造一个字符串,保留当前位之前,其后的位全部填
string Tmp = s.substr(0, i + 1) + string(n - i - 1, '9');
if (Tmp >= s)
{
continue;
}
- 如果
Tmp < s ,说明当前位及之前的部分不变且后面填9 得到的数比原数小,此时需要一些微调。此时把当前位数字加2 (因为当前位为奇数,加2 后还为奇数,也可保障最小)。当前位之前的部分保留,当前位替换为当前数加2 ,后面的位同样填充为1 。
int Nxt = Nownum + 2;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;
好了思路部分就完成了,还是建议各位同学参考以上的核心代码,不要抄袭。
code
#include "bits/stdc++.h"
#define int long long
using namespace std;
string solve(string s)
{
int n = s.size();
for (int i = 0; i < n; ++i)
{
int Nownum = s[i] - '0';
if (Nownum % 2 == 0)
{
int Nxt = Nownum + 1;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;
}
else
{
string Tmp = s.substr(0, i + 1) + string(n - i - 1, '9');
if (Tmp >= s)
{
continue;
}
else
{
int Nxt = Nownum + 2;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;
}
}
}
return s;
}
signed main()
{
int T;
cin >> T;
while (T--)
{
int a;
cin >> a;
string s = to_string(a);
string s_ = solve(s);
int Targ = stoll(s_);
cout << Targ - a << endl;
}
return 0;
}
以上就是本题解的全部内容了。
看我写的这么辛苦,难道不给我点个赞莫
希望审核给我通过吧 QwQ