问题标题: 酷町堂:6750 "1"的个数

0
0
已解决
万韧山
万韧山
初级天翼
初级天翼

题目链接: 酷町堂:6750

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int er(int n){ //转换为二进制
    int p=0,a[500],r;
    while(n){
        a[++p]=n%2;
        n/=2;
    }
    for(int i=p;i>=1;i--){
        r=r*10+a[i];
    }
    return r;
}
bool zs(int n){//判断质数
    if(n<=1) return 0;
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0) return 0;
    }
    return 1;
}
bool v(int n){ //判断转换为二进制之后1的个数为质数
    for(int i=1;i<=n;i++){
        int y=er(i);
        bool s=zs(y);
        if(s){
            return 1;
        }else{
            return 0;
        }
    }
}
int main()
{
    int a,b;
    int cnt=0;
    for(int i=a;i<=b;i++){
        if(v(i)) cnt++;
    }
    cout<<cnt;
    return 0;
}

所以我没学过位运算。。。

所以我的代码输出0。。。

所以请求大佬帮助qwq


0
已采纳
任欣怡
任欣怡
资深守护
资深守护

看题昂:【数据说明】
1≤a≤b≤106
且b-a的最大值为10000

这题的数据范围比较大

所以在写转二进制的函数时要用long long

 

第三个函数有点问题

看题:找出整数转换为二进制之后1的个数为质数的总数目。

你转换成二进制后

你要循环取位数,遍历这个数

如果有一位是1,那么记录

最后再判断当前这个数的二进制下1的个数是否为质数

 

第39行的循环已经将当前这个数遍历了一遍

所以我们只需要对当前这个数进行处理就行

第25行的循环改成取位数就行

 

改一下吧

加油你能行ヾ(◍°∇°◍)ノ゙

PS:我记的笔记好多QAQ有时间就打一点别急昂

0
李奕歌
李奕歌
初级天翼
初级天翼
核心:
int a,b,ans,cnt,w;

for(int i=a;i<=b;i++){
    w=i;
    while(w){
        if((w&1)==1){
            cnt++;
        }
        w=w>>1;
    }
    if(f(cnt)){
        ans++;
    }
    cnt=0;
}

 

0
李伟宸
李伟宸
高级守护
高级守护

第一个函数有问题

第三个函数可以不要

第一个函数输出二进制1的个数

三句保证AC

 

0
宋子墨
宋子墨
新手天翼
新手天翼

只用判断质数的函数

定义数组c[105]

定义a,b,t,cnt=0,jy=0,p

cnt用来计1的个数是质数的个数

jy用来计单个二进制1的个数

t是用来转换成二进制的(t/=2)

p是用在c数组里

数组c[105]是用来计二进制的每个位的

输入a,b;

循环a到b

t为i

p为0

jy为0

把t转换成二进制(c数组来计,转换完输出时不输出,改成成if(c[j]==1) jy++)

如果jy是质数

cnt++

最后输出cnt

 

0
0
0
任欣怡
任欣怡
资深守护
资深守护

课堂笔记给你昂

位运算

1.按位与    &

5&2

0&1=0

0&0=0

1&0=0

1&1=1

与逻辑运算符与(&&)类似

2个数a,b进行按位与操作时

是将对应的二进制数,最低位对齐,高位补0

每一位进行按位与运算

最后的结果再转换成10进制数

例:

5的二进制数:101

2的二进制数:10

   1 0 1

   0 1 0

————

   0 0 0

5&2=0

 

阿巴巴打不完了

先发一部分吧

 

 

0
0
宋子墨
宋子墨
新手天翼
新手天翼

异或^{ 
    10变成2进制 01010
    5变成2进制  0101 
    用^就是    01010
                     00101
     结果是      01111 十进制结果是 15 
     简单说就是上下对比,不一样就1,一样就0。 
     ans^=a;
     能挑出单个的 
     原理 a^a=0 0^a=a; 
    }
    与&{
    10变成2进制 01010
    5变成2进制   0101 
    用&就是    01010
                     00101
     结果 是     00000    十进制结果是 0
     简单说就是上下对比,一样就1,不一样就0。 
    }

我要回答