CCF-GESP计算机学会等级考试2026年3月三级C++T1 二进制回文串
·
B4499 [GESP202603 三级] 二进制回文串
题目描述
对于一个正整数 nnn,我们将其转换为不含前导零的二进制表示,如果这个二进制序列从左向右读与从右向左读完全相同,则称该数为二进制回文数。例如,999 的二进制表示为 (1001)2(1001)_2(1001)2,是二进制回文数;121212 的二进制表示为 (1100)2(1100)_2(1100)2,不是二进制回文数。
你的任务是:给定一个正整数 nnn,计算在 111 到 nnn 的范围内二进制回文数的数量。
输入格式
输入一行,包含一个正整数 nnn。
输出格式
输出一行,包含一个数,表示在 111 到 nnn 的范围内二进制回文数的数量。
输入输出样例 #1
输入 #1
15
输出 #1
6
说明/提示
样例解释
样例 1 中,111 到 151515 范围内 111、333、555、777、999、151515 是二进制回文数。
数据范围
1≤n≤1051 \leq n \leq 10^51≤n≤105。
解析
枚举每个数,按二进制拆位,然后在反向组合,详见代码:
#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;
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)