精华内容
下载资源
问答
  • 数据组小于等于10 每组输入一共行, 第一行一数字N,表示数字个数行N数字,表示a[1]~a[N] Output 每组输出一共N行,表示对于a[i]来说,是否存在一aj使得(a[i] and a[j])结果为0 存在则输...

    题目传送门


    Description

    给定N个数字,第i个数字的大小为a[i],请问ai是否存在aj使得(a[i] and a[j])的结果为0


    Input

    数据组数小于等于10 每组输入一共两行, 第一行一个数字N,表示数字个数 第二行N个数字,表示a[1]~a[N]


    Output

    每组输出一共N行,表示对于a[i]来说,是否存在一个aj使得(a[i] and a[j])的结果为0 存在则输出"YES",否则输出"NO"


    Sample Input

    5

    1 2 3 4 5

    2

    1 1


    Sample Output

    YES

    YES

    YES

    YES

    YES

    NO

    NO


    Hint

    1<=a[i]<=1000000

    N<=1000000


    Source

    "科林明伦杯"哈尔滨理工大学第九届程序设计团队赛


    分析

    • 对于某个数 a ,先得到肯定和 a 按位与得0的数,即 k & a = 0,
      易得 k = a ^ maxn(11111…1111)
    • 对于 k 的每位的 1 ,逐渐删减,暴力 ,记录仍然和 a 按位与得 0 的值
    • 暴力找一遍即可

    AC-Code

    #include<bits/stdc++.h>
    	using namespace std;
    	typedef long long ll;
    	const ll maxn = (1 << 20) - 1;
    	ll a[maxn + 5], dp[maxn + 5];
    	int main() {
    		ll n;
    		while (scanf("%lld", &n) == 1) {
    			memset(dp, 0, sizeof(dp));
    			for (int i = 1; i <= n; i++) {
    				scanf("%lld", &a[i]);
    				dp[maxn ^ a[i]] = 1;
    			}
    			for (int i = maxn; i >= 1; i--) {
    				if (dp[i]) {
    					for (int j = 0; j <= 20; j++) {
    						if (i & (1 << j)) {
    							dp[i ^ (1 << j)] = 1;
    						}
    					}
    				}
    			}
    			for (int i = 1; i <= n; i++) {
    				if (dp[a[i]]) printf("YES\n");
    				else printf("NO\n");
    			}
    		}
    
    	}
    
    展开全文
  • 题目描述 有一正整数,请找出其二进制表示中1的个数相同、且...思路:这道题没想到什么好办法,只想到了暴力法,先判断二进制有几1,然后前面那个数从x-1开始试,后面那个数从x+1开始试,看那个数的二进制
    题目描述
    有一个正整数,请找出其二进制表示中1的个数相同、且大小最接近的那两个数。(一个略大,一个略小)
    给定正整数int x,请返回一个vector,代表所求的两个数(小的在前)。保证答案存在。
    测试样例:
    2

    返回:[1,4]


    思路:这道题没想到什么好办法,只想到了暴力法,先判断这个数二进制有几个1,然后前面那个数从x-1开始试,后面那个数从x+1开始试,看那个数的二进制中1的个数和x相等。


    #include<iostream>
    using namespace std;
    #include<vector>
    
    //求x中二进制1的个数
    int GetBinNum(int x)
    {
    	int count = 0;
    	while(x)
    	{
    		count++;
    		x = x & (x-1);
    	}
    	return count;
    }
    
    vector<int> GetCloseNumber(int x)
    {
    	vector<int> ret;
    	if(x <=0)
    		return ret;
    
    	int count = GetBinNum(x);
    
    	int pre = x-1;
    	while(GetBinNum(pre)!= count)
    		pre--;
    	ret.push_back(pre);
    
    	int next = x+1;
    	while(GetBinNum(next) != count)
    		next++;
    	ret.push_back(next);
    
    	return ret;
    }
    
    
    int main()
    {
    	int num = 2;
    
    	vector<int> ret = GetCloseNumber(num);
    	
    	for(int i = 0; i < ret.size(); ++i)
    		cout << ret[i] << " ";
    	cout <<endl;
    }
    


    展开全文
  • 二进制求值

    2019-10-23 14:05:19
    给定两个二进制字符串,返回他们和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 利用ca记录进位,sum记录每位计算,要用到三元表达式计算。...

    给定两个二进制字符串,返回他们的和(用二进制表示)。
    输入为非空字符串且只包含数字 1 和 0。

    示例 1:
    输入: a = “11”, b = “1”
    输出: “100”

    利用ca记录进位,sum记录每位的计算,要用到三元表达式计算。注意一点,a和b的位数可能不一样,反应在i和j上,三元表达式中就要先判断,其次利用ASCII计算没位字符大小。

        public String addBinary(String a, String b) {
            StringBuilder ans = new StringBuilder();
            int ca = 0;
            for(int i = a.length() - 1, j = b.length() - 1;i >= 0 || j >= 0; i--, j--) {
                int sum = ca;
                sum += i >= 0 ? a.charAt(i) - '0' : 0;
                sum += j >= 0 ? b.charAt(j) - '0' : 0;
                ans.append(sum % 2);
                ca = sum / 2;
            }
            ans.append(ca == 1 ? ca : "");
            return ans.reverse().toString();
        }
    
    展开全文
  • 解题思路:看一眼n的大小,发现只有20,所以我们可以用决策搜索,或者二进制枚举解决,用搜索做法则需要判断第i位置是否选取,然后当前的总和是多少,其实用二进制枚举也是这样做的,我们判断当前这个数是否选取,...

    题目链接:传送门
    解题思路:看一眼n的大小,发现只有20,所以我们可以用决策搜索,或者二进制枚举解决,用搜索做法则需要判断第i个位置是否选取,然后当前的总和是多少,其实用二进制枚举也是这样做的,我们判断当前这个数是否选取,然后每次选取从1到n判断是否选取完成后,把选取的和与k进行比较,如果相等则直接按照给定选取的序列的顺序输出就行。其实两种做法的原理,或者说思路都是一样的。时间复杂度均为\(O(2^N)\)
    搜索Code://8MS

    #include<bits/stdc++.h>
    using namespace std;
    int n,k,a[25],vis[25];
    bool fg;
    void dfs(int loc,int sum) {
    	if(loc == n + 1 || fg) {
    		if(sum == k) {//当前总和等于k
    			fg = true;
    			puts("YES");
    			for(int i = 1;i <= n; ++i)
    				if(vis[i])
    					printf("%d ",a[i]);
    			putchar('\n');
    		}
    		return;
    	}
    	vis[loc] = 1;
    	dfs(loc+1,sum+a[loc]);//选取第loc个位置的数
    	vis[loc] = 0;
    	dfs(loc+1,sum);//不选去第loc个位置的数
    }
    
    int main()
    {
    	while(~scanf("%d%d",&n,&k)) {
    		fg = false;
    		for(int i = 1;i <= n; ++i)
    			scanf("%d",&a[i]);
    		dfs(1,0);
    		if(!fg)
    			puts("NO");
    		memset(vis,0,sizeof vis);
    	}
    	return 0;
    }

     
    二进制枚举Code://64MS

    #include<bits/stdc++.h>
    using namespace std;
    int n,k,a[25],b[25];
    int main()
    {
    	while(~scanf("%d%d",&n,&k)) {
    		for(int i = 0;i < n; ++i)	scanf("%d",&a[i]);
    		bool fg = true;
    		for(int i = 0,len = 1 << n;i < len; ++i) {//我们把选取的状态拆分为2^N,然后找到我们需要的就break就行
    			long long temp = 0;
    			for(int j = 0; j < n; ++j)
    				if(i >> j & 1)//选取第j个元素
    					b[j] = 1,temp += a[j];
    				else//不选去
    					b[j] = 0;
    			if(temp == k) {
    				fg = false;
    				puts("YES");
    				for(int i = 0;i < n; ++i) {
    					if(b[i])
    						printf("%d ",a[i]);
    				}
    				putchar('\n');
    				break;
    			}
    		}
    		if(fg)
    			puts("NO");
    	}
    	return 0;
    }
    展开全文
  • 补充1:关于C语言中将10进制数打印成二进制数,参考http://www.cnblogs.com/zhuchunxu/p/8676153.html  补充2:关于位移,左移动、右移动 以6和-6为例子,这里涉及到负数在计算机中补码表示(以8位为例子) 6...
  • 1.首先让两个字符串等长,若不等长,在短字符串前补零,否则之后操作会超出索引。 2.然后从后到前遍历所有位数,同位相加,这里有一个点,用是字符相加,利用 ASCII 码,字符在内部都用数字表示,我们不需要...
  • 十六进制转十进制

    2017-07-12 10:56:40
    输入十六进制从后往前(低位到高位)依次判断字符代表数值大小,再 乘以16位数几次方(相当于十进制,百位千位对应于10的二次和三次方) 直到“0x”处停止,累加输出对应进制数*/ #include #...
  • 不用if判断两数大小

    2010-03-04 13:46:11
    [code="java"] int a=4,b=9; int[] tempArray={a,b};... System.out.println(tempArray[temp>...进行了位运算。...二进制中非负数第一位用0表示。...而int 型占4字节也就是32位二进制。 ...
  • 最小存储单位是位(bit):一位仅可以表示0/1种值,用来存放二进制数的位(类似10进制的位、十位、百位,只是十进制的一位,可以表示 0~9 一共10种值)。由于位只能表示0/1,所以,大多数情况下,要表示...
  • [code="java"] int a=4,b=9; int[] tempArray={a,b}; int temp=a-b;... System.out.println(tempArray[temp>...二进制中非负数第一位用0表示。负数用1表示。而int 型占4字节也就是3...
  • 比较两个浮点数的大小

    千次阅读 2016-05-07 10:38:34
    在数学运算当中经常会涉及到判断两个数是否相等情况  对于整数很好处理 A==B这样一个语句就可以解决全部问题  但是对于浮点数是不同  首先,浮点数在计算机当中的二进制表达方式就决定了大多数...
  • 将数字转化为二进制进行数位dp,因为一个二进制数的最高位必须为1,所以设置变量first记录前面位是否有1,若有1,则可任意放,否则,只可放1。 同时,上面的判断决定了搜索时len的大小与二进制本身的长度不一定...
  • 数字逻辑练习题 一、判断题 ...4.74LS85是一种四位二进制数值比较器,它可以用来判断两个四位二进制数的大小关系,但它不能通过级联用在更多位数值数据的比较。 正确答案: × 5.JK触发器具有的功能是:
  • 为什么浮点数不能直接比...因此我们在比较两个float是否相等时,不能仅仅依靠 == 来进行判断,而是当他们两者差小于一个我们可以容忍小值时,就可以认为他们就是相等。 那么Python是如何解决呢? 第一种方法:
  • 最接近的数

    千次阅读 2016-06-22 15:34:47
    题目描述 有一正整数,请找出其二进制表示中1的个数相同、且...思路:以给出的数为基础,先将给出的数的二进制中有几1判断出来,然后再分别判别当前数左边右边的数是否二进制中的1也和当前数一样 代码如下:
  • get和post是http协议的两种方法,另外还有head,delete等这种方法有本质区别,get只有一流,参数附加在url后,大小个数有严格限制且只能是字符串。post参数是通过另外流传递,不通过url,所以可以很大,...
  • PAGE PAGE 1 进制数 JAVA用是十进制但底层用二进制 十六进制 十六进制一位数代表二进制四位数 关系运算 关系运算比算数运算优先级低但比赋值运算高 判断是否相等==和=优先级低 6>5>4这句话是错6>5是true而...
  • bzoj 4942: [Noi2017]整数

    2018-07-15 11:53:00
    Description Solution 加法减法可以分开考虑,如果只有加法的话,直接暴力进位复杂度...那么就需要判断两个二进制数的某个后缀的大小,我们二分出第一个不相同的位置,然后判断一下这一位的大小关系即可 可以用 \(zkw\...
  • 第一章进制数 JAVA 用是十进制但底层用二进制 十六进制 十六进制一位数代表二进制四位数 关系运算 关系运算比算数运算优先级低但比赋值运算高 判断是否相等==和=优先级低 6>5>4 这句话是错6>5 是true 而true...
  • 有些数据在存储时并不需要占用一个完整字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域数据...
  • 1235 -- 比较大小

    千次阅读 2015-09-07 17:01:36
    比较大小 Time Limit:1000MS Memory Limit:...我们重新定义两个数的大小比较规则为:谁的二进制表示中含1的个数多谁大,若含1的个数相等,则按普通的大小关系进行比较。 Input 第一行:一个整数T,表示测试数据组数
  • Problem 1130 - 比较大小

    2013-08-10 22:51:00
    /* Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 591 Accepted: 206 Special ... 我们重新定义两个数的大小比较规则为:谁的二进制表示中含1的个数多谁大,若含1的个数相等,则按普通的大...
  • 场景 现有40亿不重复无符号整数,未排序。...数据是否保存在40亿条数据当中,有存在/不存在种状态,可以使用二进制1/0在比特位中进行标记。 40亿条数据为无符号整形,其最大取值范围为0到0xfffff
  • XDOJ1130 - 比较大小

    2014-08-22 15:09:08
    我们重新定义两个数的大小比较规则为:谁的二进制表示中含1的个数多谁大,若含1的个数相等,则按普通的大小关系进行比较。   Input 第一行:一个整数T,表示测试数据组数。 接下来共T行,每行两个整数A,B。(A,B...
  • 1010. Radix (25)

    2017-02-14 10:53:48
    根据未知进制数的各个未知的字符及已知进制数的数的大小判断位置进制数进制的范围,然后再这范围内进行分查找 ps:额外判断一下位数的情况#include #include #include #pragma warning(disable :4244) ...
  • 进制基础人事 进制概述 进位制是一种计数方式 用优先数字符号表示无限数值 进制的种类 2 4 6 8 16 20 60 ...判断两个操作数大小复杂 使用绝对值大减去小复杂 对于符号值,以绝对值大为准 ...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 299
精华内容 119
关键字:

判断两个二进制数的大小