0
点赞
收藏
分享

微信扫一扫

追梦算法----拯救公主?

楠蛮鬼影 2022-03-12 阅读 66
c++

说明

今天是十月三号,学姐还没有想好该出什么题,有点慌张,但是学姐最近迷上了一堆小游戏,其中一个学姐不想玩,你可以帮忙将这个小游戏玩通关吗?

游戏规则很简单,游戏一开始,你将身处于一座城堡之中,公主被巨龙抓走到了山谷里,你需要去拯救公主。

发布者会给你两个一维坐标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;
}

 

举报

相关推荐

0 条评论