精华内容
下载资源
问答
  • 输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少个Round number 所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Number

    题意:

    输入两个十进制正整数ab,求闭区间 [a ,b] 内有多少个Round number

    所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制数中0的个数大于等于1的个数,则它就是一个Round Number


    题解


    Round Numbers
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 11653   Accepted: 4380

    Description

    The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors', 'Ro, Sham, Bo', and a host of other names) in order to make arbitrary decisions such as who gets to be milked first. They can't even flip a coin because it's so hard to toss using hooves.

    They have thus resorted to "round number" matching. The first cow picks an integer less than two billion. The second cow does the same. If the numbers are both "round numbers", the first cow wins,
    otherwise the second cow wins.

    A positive integer N is said to be a "round number" if the binary representation of N has as many or more zeroes than it has ones. For example, the integer 9, when written in binary form, is 1001. 1001 has two zeroes and two ones; thus, 9 is a round number. The integer 26 is 11010 in binary; since it has two zeroes and three ones, it is not a round number.

    Obviously, it takes cows a while to convert numbers to binary, so the winner takes a while to determine. Bessie wants to cheat and thinks she can do that if she knows how many "round numbers" are in a given range.

    Help her by writing a program that tells how many round numbers appear in the inclusive range given by the input (1 ≤ Start < Finish ≤ 2,000,000,000).

    Input

    Line 1: Two space-separated integers, respectively Start and Finish.

    Output

    Line 1: A single integer that is the count of round numbers in the inclusive range Start..Finish

    Sample Input

    2 12

    Sample Output

    6

    Source



    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<iomanip>
    using namespace std;
    
    #define all(x) (x).begin(), (x).end()
    #define ysk(x) (1(ll)<<(x))
    #define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
    #define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
    typedef long long ll;
    typedef pair<int, int> pii;
    const int INF =0x3f3f3f3f;
    const int maxn=34    ;
    int le,ri;
    int bin[40];//存放一个数的二进制编码,bin[0]表示长度,bin[1]表示最低位的二进制编码
    ll ans,C[maxn][maxn];
    void pre(int x)
    {
        bin[0]=0;
        while(x)
        {
            bin[++bin[0]]=x%2;
            x/=2;
        }
    
    }
    ll cal(int x)
    {
        if(!x) return 0;//这种按位处理和进制转换的题目,特别小心0的情况。
        ll ret=0;
        pre(x);
        for(int len=1;len<bin[0]-1;len++)//除去最高位的1,可用位数为len
        {
            int zero_least=(len+2)/2;//0至少要出现的次数
            for(int num=zero_least;num<=len;num++)
            {
                ret+=C[len][num];
            }
        }
    
        int zero_num=0;
        for(int p=bin[0]-1;p>=1;p--)
        {
            if(!bin[p])
            {
                zero_num++;
            }
            else
            {
                int zero_least= (bin[0]+1)/2 -zero_num-1 ;
                zero_least=max(0,zero_least);
                for(int num=zero_least;num<=p-1;num++)
                {
                    ret+=C[p-1][num];
                }
            }
        }
        if(zero_num>= (bin[0]+1)/2 )  ret++;
        return ret;
    
    }
    
    void getC()
    {
        C[0][0]=1;
        for(int i=1;i<=maxn;i++)
        {
            C[i][0]=C[i][i]=1;
            for(int j=1;j<i;j++)
            {
                C[i][j]=C[i-1][j-1]+C[i-1][j];
            }
        }
    
    }
    int main()
    {
        getC();
        scanf("%lld%lld",&le,&ri);
    
        ans=cal(ri)-cal(le-1);
        printf("%lld\n",ans);
    
        return 0;
    }
    



    展开全文
  • 程序员二进制计算器 v1.36

    热门讨论 2014-07-16 16:21:43
    支持二进制串直接运算,如0b1101 & 0b0011= 0b0001。 支持与、或、非、异或、移位(循环、逻辑、算术),直接读写二进制位,指定位段读、写、置1、清0、反转。 二进制数据表达方式多样,数据可以K、M、G等单位为后缀。...
  • 要求:一个数的二进制数的0的个数大于等于1的个数,则这个数称为"round number",问[a,b]有多少"round number"。 方法:数位dp 记忆化搜索 1.dp[i][j][k]示i位数 j个0 k个1的个数。 2.套路...

    要求:一个数的二进制数的0的个数大于等于1的个数,则这个数称为"round number",问[a,b]有多少"round number"。

    方法:数位dp 记忆化搜索

    1.dp[i][j][k]示i位数 j个0 k个1的个数。

    2.套路记忆化搜索即可,细节在代码中说明。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <map>
    using namespace std;
    long long dp[40][40][40] ;
    //dp[i][j][k]示i位数 j个0 k个1的个数 
    int digit[40] ;
    long long dfs(int len , int num0 , int num1 , int lim , int bz)
    {
    //len 表示当前的位数 
    //num0 记录遍历到当前位时前面的0出现的个数
    //num1 记录遍历到当前位时前面的1出现的个数
    //lim 当前位是否有上限
    //bz 是否前面已经有1 若前面没有1 则num0不会增加 
        int i , j ;
        int num ;
        int ans = 0 ;
    	if(len <= 0)//搜索到底层 
    	   return num0 >= num1 ;
    	if(!lim && bz == 1 && dp[len][num0][num1] != -1)//若满足条件且已搜索过
    	   return dp[len][num0][num1] ;
    	if(lim) //若有上限,则可取到这个数的此位数 
    	   num = digit[len] ;//num表示当前位的上限 
    	else   //若无上限,则可取到1 
    	   num = 1 ;
    	for(i = 0 ; i <= num ; i ++)
    	{
    	   if(bz == 0)//前面没有1 
    	   {
    	   	 if(i == 0)
    	      ans += dfs(len - 1 , num0 , num1 , lim && i == num , 0) ; //前面没有1且当前位为0,则num0不增加。 
    	     else
    	      ans += dfs(len - 1 , num0 , num1 + 1 , lim && i == num , 1) ;	
    	   }
    	   else//前面有1 
    	   {
    	     if(i == 0)
    	      ans += dfs(len - 1 , num0 + 1 , num1 , lim && i == num , 1) ;
    	     else
    	      ans += dfs(len - 1 , num0 , num1 + 1 , lim && i == num , 1) ;		
    	   }   	
    	}   
    	if(!lim && bz == 1) 
    	   dp[len][num0][num1] = ans ;//已经搜索过的不用再次搜索 
    	return ans ; 
    }
    long long solve(long long x)
    {
    	  int len ;
          len = 0 ;
    	  while(x)
          {
          	digit[++len] = x % 2 ;
          	x /= 2 ;
    	  }
          return dfs(len , 0 , 0 , 1 , 0) ;
    }
    int main()
    {
    	int t ;
    	int i , j , k ;
    	int a , b ;
    	int ans ;
    	memset(dp , -1 , sizeof(dp)) ;
        scanf("%d%d" , &a , &b) ;
        ans = solve(b) - solve(a - 1) ;//因为solve(x)返回的是1~x的值,因此计算a时需要传递参数a-1。 
        printf("%d" , ans) ;
    }

     

    展开全文
  • 假设:和为s,积为p,两个整数为a和b,其中s=a+b, p=a*b,称其为一对第1步:我不知道这两个整数是多少,但我肯定你也不知道。这说明:1、我不知道:s至少是两对整数的和,如果仅有一对的话,即a+b=s,那么“我”就...

    45b854aada91765eaba175e52a230838.png

    假设:和为s,积为p,两个整数为a和b,其中s=a+b, p=a*b,称其为一对

    第1步:我不知道这两个整数是多少,但我肯定你也不知道。

    这说明:

    1、我不知道:s至少是两对整数的和,如果仅有一对的话,即a+b=s,那么“我”就知道这两个数是什么了,如5。

    2、我肯定你也不知道:对于所有相加等于s的两个整数,他们的乘积p,至少有两对整数的乘积与p相等,同上,如果只有一对整数的乘积等于p,那么“你”就肯定知道这两个数了。

    换句话说,这两个数不能都是质数

    对于和为s的所有整数对,都要满足2,这就是“我肯定”的意思,因为只要有一对全部都是质数的话,“我”就不能“肯定”了。

    所以,找到和为s,积为p,但不同时为质数的所有整数对

    结果:和为11,17,23,27,29,35,37,41,47,51,53的整数满足条件第2步:我本来不知道这两个数是多少。但既然你这么说,那我现在知道了。

    这说明:

    1、对于乘积为p的所有整数对,至少有一对他们的和是第1步结果之一

    2、“我现在知道”说明对于乘积为p的整数对中,只有一对的和是第1步结果之一,如果不止一对的话,“我”还是不能确定。

    所以:对于第1步结果中所有可能的整数对,相乘得到p,再统计所有乘积为p的整数对的和在第1步结果中出现的次数,出现次数为1的即为结果。

    结果:整数对为4,13,他们和是s=17,他们的乘积为p=52只回答第三题

    import java.util.*;

    public class FindOut {

    static int MIN = 2;

    static int MAX = 99;

    static boolean[] available = new boolean[(MAX+MIN+1) * 2];

    public static void main(String[] args) {        loop1:for (int s=MIN*2; s<=MAX*2; s++) {

    available[s]  = false;

    Vector<IntPair> v = getAddFactors(s);

    int len = v.size();

    if (len < 2) {

    continue loop1;

    }

    for (int i=0; i<len; i++) {

    IntPair ip = v.get(i);

    if (isPrimePair(ip)) {

    continue loop1;

    }

    }

    available[s]  = true;

    }

    for (int s=MIN*2; s<=MAX*2; s++) {

    if (available[s]) {

    Vector<IntPair> v = getAddFactors(s);

    int index = indexOfAvailableSum(v);

    if (0 <= index) {

    IntPair ip = v.get(index);

    System.out.println("Result is: " + ip.l + "," +     ip.r + "  and sum=" + s + ", product=" + ip.l*ip.r);

    }

    }

    }

    }

    static Vector<IntPair> getAddFactors(int sum) {

    Vector<IntPair> v = new Vector<IntPair>();

    int max = Math.min((int)((sum+1)/2), MAX);

    for (int i=MIN; i<=max; i++) {

    int j = sum - i;

    if ((i <= j) && (j<=MAX)) {

    v.add(new IntPair(i, j));

    }

    }

    return v;

    }

    static boolean isPrimePair(IntPair ip) {

    for (int i=2; (i*i)<=ip.l; i++) {

    if (ip.l % i == 0) {

    if ( (ip.r*i)<=MAX ) {

    return false;

    }

    }

    }

    for (int i=2; (i*i)<=ip.r; i++) {

    if (ip.r % i == 0) {

    if ( (ip.l*i)<=MAX ) {

    return false;

    }

    }

    }

    return true;

    }

    static int indexOfAvailableSum(Vector<IntPair> v) {

    int result = -1;

    int len = v.size();

    int[] count = new int[len];

    for (int i=0; i<len; i++) {

    count[i] = 0;

    IntPair ip = v.get(i);

    int p = ip.l * ip.r;

    for (int j=2; (j*j)<=p; j++) {

    if ((p%j == 0) && (p/j <= MAX)) {

    if (available[j + p/j]) {

    count[i]++;

    }

    }

    }

    }

    int count1 = 0;

    for (int i=0; i<len; i++) {

    if (1 == count[i]) {

    count1++;

    }

    }

    if (1 == count1) {

    for (int i=0; i<len; i++) {

    if (1 == count[i]) {

    result = i;

    }

    }

    }

    return result;

    }

    }

    class IntPair {

    int l;

    int r;

    IntPair(int i1, int i2) {

    l = i1;

    r = i2;

    }

    }

    编译通过

    ◆◆

    评论读取中....

    请登录后再发表评论!

    ◆◆

    修改失败,请稍后尝试

    展开全文
  • “一个字等于多少个字节?”是一个不严谨的问法

    万次阅读 多人点赞 2018-03-12 13:22:16
    1、位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位。 2、字节(byte) 字节来自英文Byte,音译为“拜特”,习惯上用大写的“B”表示。 字节是计算机数据处理的基本单位...

    “一个字等于多少个字节?”是一个不严谨的问法

    直接回答一个字等于多少个字节,也是不严谨的答法。

    相关概念:

    1、位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位

    2、字节(byte) 字节来自英文Byte,音译为“拜特”,习惯上用大写的“B”表示。 字节是计算机中数据处理的基本单位。

    3、字 (word)计算机进行数据处理时,一次存取、加工和传送的数据长度称为字。一个字通常由一个或多个(一般是字节的整数位)字节构成。

    字、字节、位之间的关系

    网上看了很多回答,都是很片面的,也就是在有的情况下是对的,有的情况下是错的。

    比如这篇文章,看的人很多,点赞的也很多,但指出有错误的却很少。

    以下是该文章截图:

    以下是评论截图:

    论据:

    先看一段摘抄自《Computer system: a programmer's perspective》的说明:

    Buses are typically designed to transfer fixed-sized chunks of bytes known aswords. The
    number of bytes in a word (the word size) is a fundamental system parameter that
    varies across systems. Most machines today have word sizes of either 4 bytes (32
    bits)or8bytes(64bits).

    翻译过来就是说:总线一般被设计来传输固定大小的一块数据,这块数据被称为字(word),一个字包含的字节数(即字的大小)是各种计算机系统里面的基本参数,而且这个参数在不同的系统里通常是不同的。大多数的现代计算机系统里面,一个字要么是4个字节(32位),要么是8个字节(64位).

    结论:

           一个字等于多少个字节,与系统硬件(总线、cpu命令字位数等)有关,不应该毫无前提地说一个字等于多少位。

    正确的说法:

    ①:1字节(byte) = 8位(bit)

    ②:在16位的系统中(比如8086微机) 1字 (word)= 2字节(byte)= 16(bit)

           在32位的系统中(比如win32) 1字(word)= 4字节(byte)=32(bit)

           在64位的系统中(比如win64)1字(word)= 8字节(byte)=64(bit)

    内推:

    有想换工作的小伙伴吗?

    对网易感兴趣的话欢迎添加本人微信:urus35

    各种方向的岗位都有噢~(坐标:广州北京上海杭州)

    展开全文
  • 1、位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位。 2、字节(byte) 字节来自英文Byte,音译为“拜特”,习惯上用大写的“B”表示。 字节是计算机数据处理的基本单位...
  • 信息的最小单位是位(bit,简写为小写 b),是二进制数的一位包含的信息或 2 个选项特别指定 1 个的需要信息量。由于这个单位太小,为了方面描述,将 8 个位组成一个字节(byte,简写为大写 B,CPU 能够直接处理的...
  • 信息的最小单位是位(bit,简写为小写 b),是二进制数的一位包含的信息或 2 个选项特别指定 1 个的需要信息量。由于这个单位太小,为了方面描述,将 8 个位组成一个字节(byte,简写为大写 B,CPU 能够直接处理的...
  • 相关概念:1、位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位。2、字节(byte) 字节来自英文Byte,音译为“拜特”,习惯上用大写的“B”表示。 字节是计算机数据处理的...
  • 我们在数据库设置一个int类型,设置好长度,然后会发现并没有受到长度的限制,这是因为...即4B=32b,也就是二进制的32个1,我们算一下二进制下32个1等于十进制的多少: 小插曲,我在网上找的进制转换,上图...
  • 由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。  在2n位二进制...
  • int的存储大小是4个字节(B),计算机存储单位的换算:1B=8b1KB=1024B1MB=1024KB即4B=32b,也就是二进制的32个1,我们算一下二进制下32个1等于十进制的多少:小插曲,我在网上找的进制转换,上图是31个1,已经是int...
  • poj3252Round Numbers(数学问题)

    万次阅读 2017-05-02 15:38:59
    所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Number 注意,转换所得的二进制数,最高位必然是1,最高位的前面不允许有0 #...
  • POJ 3252 Round Numbers 组合数学 题意:输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少个Round number。...Round Number:把一个十进制数转换为一个无符号二进制数,该二进制0的个数大于等于1的个数。
  • poj-3252-Round Numbers

    2012-10-25 14:12:17
    所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Number 做法:先求0到a有多少个数。再求0到b多少个数,然后相减即为最后的结果。 ...
  • poj3252 Round Numbers

    2017-08-18 21:59:00
    所谓的Round Number就是一个把十进制数转换成一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Number。 注意 转换所得的二进制数,最高位必然是1,最高位前不允许有0 /* ...
  • B等于N的二进制表示法的位数。B的值是多少? d. 你的程序在最坏的情形下的运行时间是多少(用B表示)? e. 比较确定一个20(二进制)位的数是否是素数和确定一个40(二进制)位的树是否是素数的运行时间。 f...
  • 所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Number。 思路:用dp来做:dp[i][j]表示二进制长度为 i 的数字含 j 个0的个数,比如dp...
  • 正整数N是否是素数

    2016-09-21 00:22:00
    B等于N的二进制表示法的位数。B的值是多少? d. 你的程序在最坏的情形下的运行时间是多少(用B表示)? e. 比较确定一个20(二进制)位的数是否是素数和确定一个40(二进制)位的树是否是素数的...
  • POJ 3252 Round Numbers

    2013-02-17 00:35:24
    所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Number 注意,转换所得的二进制数,最高位必然是1,最高位的前面不允许有0 规定输入...
  • 大致题意: 输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少个Round number...所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Numbe
  • 内有多少个Round number,Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Number 思路:dp[cur][num1][num2]表示到当前位置0为num1,1为num2...
  • poj3252

    2014-10-27 14:41:40
      大致题意: 输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少个...所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Numbe
  • POJ3252

    2013-10-05 18:46:17
      大致题意: 输入两个十进制正整数a和b,求闭区间 [a ,b] 内有多少个...所谓的Round Number就是把一个十进制数转换为一个无符号二进制数,若该二进制0的个数大于等于1的个数,则它就是一个Round Number 注

空空如也

空空如也

1 2 3 4 5
收藏数 85
精华内容 34
关键字:

二进制中b等于多少