pintia 二进制回文

  • 872 字

题面

计算鸭定义二进制的回文为一个数的二进制 (不补前置零) 是一个回文数。
给定两个数 ,求从 之间所有的正整数(包括 )中满足其二进制是一个回文的数的个数。

输入格式:
输入两个正整数

输出格式:
输出二进制是回文的数的个数。

解析

乍一看十分简单,数据范围很小可以直接暴力。

想要判断一个数的二进制是否为回文,只要把这个数的二进制表示反转,然后判断与原数是否相等即可。

1
2
3
4
5
6
7
8
9
bool is_binary_palindrome(int x) {
int ori = x;
int rev = 0;
while (x) {
rev = (rev << 1) | (x&1);
x >>= 1;
}
return rev == ori;
}

于是信心满满提交:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdbool.h>

bool is_binary_palindrome(int x) { ... }

int main() {
int a, b, ans = 0;
scanf("%d %d", &a, &b);
for (int i = a; i <= b; i++) {
if (is_binary_palindrome(i)) ans++;
}
printf("%d", ans);
}

喜提 WA 55分。

主播当时百思不得其解,更换了无数种写法,各种询问 AI,但都是 55 分。

虽然此题十分冷门,但主播经过不懈努力还是找到了一段 AC 代码,其中赫然写着:

1
if (a > b) swap(a, b);

题目没有规定 ,而且是自然语言表述的“从 之间所有的正整数”。我们当然可以说 之间所有的正整数,很合理是不是呢 合理个p

加上之后果然就 AC 了。