GESP 2026年3月C++三级(二进制回文串)

202603-1 二进制回文串

题目描述

对于一个正整数 nnn,我们将其转换为不含前导零的二进制表示,如果这个二进制序列从左向右读与从右向左读完全相同,则称该数为二进制回文数。例如,999 的二进制表示为 (1001)2(1001)_2(1001)2,是二进制回文数;121212 的二进制表示为 (1100)2(1100)_2(1100)2,不是二进制回文数。

你的任务是:给定一个正整数 nnn,计算在 111 到 nnn 的范围内二进制回文数的数量。

输入格式

输入一行,包含一个正整数 nnn。

输出格式

输出一行,包含一个数,表示在 111 到 nnn 的范围内二进制回文数的数量。

样例输入 1

复制代码
15

样例输出 1

复制代码
6

提示

【样例解释】

样例 1 中,111 到 151515 范围内 111、333、555、777、999、151515 是二进制回文数。

【数据范围】

1≤n≤1051 \leq n \leq 10^51≤n≤105

解题思路

方法:数位翻转比较法

直接遍历 111 到 nnn 的每个数,将其二进制表示从低位到高位依次取出并重新组合成一个新的数 mmm,如果 mmm 与原数相等,则说明该数的二进制表示是回文的。

核心思想:

  • 将原数的二进制位从低到高依次取出(j%2j\%2j%2)
  • 同时将取出的位按从左到右的顺序重新组合(m=m∗2+j%2m = m*2 + j\%2m=m∗2+j%2)
  • 最终 mmm 就是原数二进制表示的翻转,若 m==im==im==i,则为回文数

代码解析

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, cnt = 0;
    cin >> n;
    
    // 遍历1到n的所有数
    for (int i = 1; i <= n; i++) {
        int j = i, m = 0;
        
        // 将i的二进制位从低到高取出,同时构建翻转后的数m
        while (j) {
            m = m * 2 + j % 2;  // 取出最低位,添加到m的最高位
            j /= 2;             // 移除最低位
        }
        
        // 如果翻转后的数等于原数,说明是二进制回文数
        if (m == i) cnt++;
    }
    
    cout << cnt;
    return 0;
}

样例验证

数字 二进制表示 翻转后的值 是否回文
1 1 1
2 10 01=1
3 11 11
4 100 001=1
5 101 101
6 110 011=3
7 111 111
8 1000 0001=1
9 1001 1001
10 1010 0101=5
11 1011 1101=13
12 1100 0011=3
13 1101 1011=11
14 1110 0111=7
15 1111 1111

结果:共6个二进制回文数(1、3、5、7、9、15)


相关推荐
蒸蒸yyyyzwd32 分钟前
cpp 选手秋招学习笔记 day33
c++·笔记·求职招聘
郝学胜-神的一滴40 分钟前
Effective Python 条款 10 :海象运算符_=
开发语言·python·程序人生·开源
wuyk55542 分钟前
Python零基础入门第十四章:异常处理(try-except)
开发语言·python
wuyk5551 小时前
【Socket 进阶之路】第 3 章 TCP 三次握手 & 四次挥手深度剖析|连接建立、断开、状态机、TIME_WAIT 核心工程问题
服务器·开发语言·网络·物联网·网络协议·tcp/ip
wzdark5 小时前
基于堆的优先队列实现原理与复杂度分析4
算法
彧azz6 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
老王熬夜敲代码7 小时前
BLAKE3:最快的密码学哈希函数
算法·密码学·哈希算法
hansang_IR7 小时前
【题解】P4460 [CQOI2018] 解锁屏幕
c++·算法
嵌入式学习菌7 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
见闻小天地7 小时前
简博斯JG-C系列彩色激光同轴位移计:摄像头模组对位与行程测量的技术价值观察
人工智能·算法