这个题目要求我们找到一个比给定正整数n大的最小数字m,使得m和n的二进制表示中1的个数相同。这是一个典型的位操作问题,涉及到二进制数的处理和优化。
首先我们需要明确几个关键点:
例如:
通过分析示例,我们可以总结出以下规律:
这种方法保证了:
javascript复制const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
const nBinStr = "0" + Number(await readline()).toString(2);
const mBinCharArr = [...nBinStr];
let countOne = 0;
for (let i = mBinCharArr.length - 2; i >= 0; i--) {
if (mBinCharArr[i] == "0" && mBinCharArr[i + 1] == "1") {
mBinCharArr[i] = "1";
mBinCharArr[i + 1] = "0";
if (countOne > 0) {
for (let j = i + 2; j < mBinCharArr.length; j++) {
mBinCharArr[j] = j < mBinCharArr.length - countOne ? "0" : "1";
}
}
break;
}
if (mBinCharArr[i + 1] == "1") countOne++;
}
console.log(parseInt(mBinCharArr.join(""), 2));
})();
java复制import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String nBinStr = "0" + Integer.toBinaryString(n);
char[] mBinCharArr = nBinStr.toCharArray();
int countOne = 0;
for (int i = mBinCharArr.length - 2; i >= 0; i--) {
if (mBinCharArr[i] == '0' && mBinCharArr[i + 1] == '1') {
mBinCharArr[i] = '1';
mBinCharArr[i + 1] = '0';
if (countOne > 0) {
for (int j = i + 2; j < mBinCharArr.length; j++) {
mBinCharArr[j] = j < mBinCharArr.length - countOne ? '0' : '1';
}
}
break;
}
if (mBinCharArr[i + 1] == '1') countOne++;
}
System.out.println(Integer.parseInt(new String(mBinCharArr), 2));
}
}
python复制nBinStr = bin(int(input()))
mBinCharArr = list("0" + nBinStr[2:])
countOne = 0
for i in range(len(mBinCharArr) - 2, -1, -1):
if mBinCharArr[i] == '0' and mBinCharArr[i+1] == '1':
mBinCharArr[i] = '1'
mBinCharArr[i+1] = '0'
if countOne > 0:
for j in range(i+2, len(mBinCharArr)):
mBinCharArr[j] = '0' if j < len(mBinCharArr) - countOne else '1'
break
if mBinCharArr[i+1] == '1':
countOne += 1
print(int("".join(mBinCharArr), 2))
c复制#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void dec2bin(int num, char *s) {
int i = 0;
while (num > 0) {
s[i++] = (char)(num % 2 + '0');
num /= 2;
}
int l = 0, r = i - 1;
while (l < r) {
char tmp = s[l];
s[l] = s[r];
s[r] = tmp;
l++; r--;
}
}
int main() {
int n;
scanf("%d", &n);
char nBinStr[1000] = {'\0'};
nBinStr[0] = '0';
dec2bin(n, nBinStr + 1);
int len = (int)strlen(nBinStr);
int countOne = 0;
for (int i = len - 2; i >= 0; i--) {
if (nBinStr[i] == '0' && nBinStr[i + 1] == '1') {
nBinStr[i] = '1';
nBinStr[i + 1] = '0';
if (countOne > 0) {
for (int j = i + 2; j < len; j++) {
nBinStr[j] = j < len - countOne ? '0' : '1';
}
}
break;
}
if (nBinStr[i + 1] == '1') countOne++;
}
printf("%ld\n", strtol(nBinStr, NULL, 2));
return 0;
}
提示:在实际编码中,建议先写出算法的伪代码,再逐步实现各个语言版本,这样可以减少错误。