B4499 [GESP202603 三级] 二进制回文串

题目描述

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

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

输入格式

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

输出格式

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

输入输出样例 #1

输入 #1

15

输出 #1

6

说明/提示

样例解释

样例 1 中,111151515 范围内 111333555777999151515 是二进制回文数。

数据范围

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

解析

枚举每个数,按二进制拆位,然后在反向组合,详见代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,cnt=0;
    cin>>n;
    for(int i=1;i<=n;i++){//枚举1到n的每一个数
        int t=i;//赋值给临时变量,避免修改i的值影响循环
        int s=0;//重新组合
        while(t>0){//按二进制拆位
            s=s*2+t%2;//重新反向组合
            t/=2;
        }
        if (s==i) cnt++;//如果反向组合出的数与原数相同,则二进制为回文
    }
    cout<<cnt;
	return 0;
}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐