虽然代码很丑,但是我觉得逻辑没问题啊,测试下来也没找到行不通的数据
一本通给的哪个参考数据测试也没问题,但是提交就1个不对
有没有佬看看就这段代码而言问题在哪,我再打打补丁
我的逻辑是把转为2进制、
全是111110000就只需要在第二位加0
1111中间有0就只需要将后一个1前移,其他位全部放到末尾
是不是有一些特殊情况会出错

using namespace std;
string er(int x) {
string erjin;
if (x == 0 || x == 1) { return string(1, '0' + x); };//转化为0的string//直接生成string返回
//return er(x/2);
return er(x / 2) + (char)(x % 2 + '0');//将先得的放在递归最后相加//利用string末尾直接相加
}
int shi(string x) {
int num = 0, n = 1;
for (int i = x.size() - 1; i >= 0; i--) {
num += (x[i] - '0') * n;
n *= 2;
}
return num;
};
void chuli(string& str, int& i, int& j) {
while (1) {
if (i == j) {
str += "0";
for (int k = 1; k < i; k++) {
str[str.size() - k] = '1';
str[1 + k] = '0';
}
break;
}
if (str[i + 1] == '1')i++;
if (str[j] == '0')j--;
if (i == str.size() - 2 && str[str.size() - 1] == '1') { str.insert(2, 1, '0'); break; }
if (str[i + 1] != '1' && str[j] != '0' && i != j) {
int count = 0;
while (1) {
if (str[i + 1] == '0')i++;
if (str[i + 1] == '1')break;
}
str[i] = '1';
for (int k = i + 2; k < str.size();) {
if (str[k++] == '1')count++;
}
for (int k = 1; k <= count; k++) {
str[str.size() - k] = '1';
}
for (int k = 1; k <= str.size() - i - count - 1; k++) {
str[i + k] = '0';
}
break;
}
}
}
int main() {
vector<string>str1;
int x;
while (1) {
cin >> x;
if (x == 0) break;
str1.push_back(er(x));
}
for (string str : str1)
{
int i = 0, j = str.size() - 1;
str.insert(0, 1, '0');
chuli(str, i, j);
str.erase(0, 1);
cout << shi(str) << endl;
}
return 0;
}