说明
今天是十月三号,学姐还没有想好该出什么题,有点慌张,但是学姐最近迷上了一堆小游戏,其中一个学姐不想玩,你可以帮忙将这个小游戏玩通关吗?
游戏规则很简单,游戏一开始,你将身处于一座城堡之中,公主被巨龙抓走到了山谷里,你需要去拯救公主。
发布者会给你两个一维坐标l和r(l<l<=r<=1e6),l和r分别是城堡和山谷的位置,从l到r之间的每一个数字都是你即将可能拥有的一起去救公主的伙伴,伙伴的条件是该数字对应的二进制数字中的1的总个数是素数,问你会有多少个伙伴和你一起去救公主(ps: 最后你千辛万苦找到了你的伙伴去到了山谷,救走了公主,然后你又一个人回到了山谷,和巨龙快乐的生活在一起,好耶,完结撒花!!)
输入格式
第一行是两个数l和r,表示城堡和山谷的位置。
输出格式
输出1行,表示有多少个伙伴
样例
输入数据 1
6 9
Copy
输出数据 1
3
Copy
提示
样例解释:
6的二进制表达是110,110中有2个1,2是素数
7的二进制表达是111,3个1,3是素数
8的二进制表达是1000,1个1,1不是素数
9的二进制表达是1001,2个1,2是素数
所以输出3。
总结反思:
看了题目很容易想到,这道题使用位运算来做。
1、这道题目的关键在于确定这个数字再二进制的情况下,1的个数。
2、没有想到可以直接让数字和1进行&操作,然后让数字左移1位再判断就好了。
以后要记住:当需要确定一个数字1的个数时,可以使用与1按位与+左移操作!!!
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <vector>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
int n;
int l,r,ans;
int main() {
scanf("%d%d",&l,&r);
for(int i=l; i<=r; i++) {
int temp=i,s=0,k=0;
while(temp) {
if(temp&1==1)
s++;
temp=temp>>1;
}
int x=sqrt(s);
for(int j=2; j<=x; j++) {
if(s%j==0) {
k=1;
break;
}
}
if(s==1)
k=1;
if(!k)
ans++;
}
printf("%d\n",ans);
return 0;
}