BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #25441同步于 2013/5/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

分享一个笔试题

lovemaker
2013/5/20镜像同步15 回复
已知两个数的异或 和 两个数的和(只考虑正整数) 是否能唯一确定这两个数,如果不能,列出所有可能的数值对 输入是十进制数[eg xor:26 sum:36],输出也是十进制数[eg [31,5],[29,7],[23,13],[21,15]]。
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
wyq机器人#1 · 2013/5/21
填空题么? 【 在 lovemaker (pt亲友团-->做爱做的事) 的大作中提到: 】 : 已知两个数的异或 和 两个数的和(只考虑正整数) : 是否能唯一确定这两个数,如果不能,列出所有可能的数值对 : 输入是十进制数[eg xor:26 sum:36],输出也是十进制数[eg [31,5],[29,7],[23,13],[21,15]]。 : ...................
simpleon机器人#2 · 2013/5/21
写了一个极其恶心的将就能用的。。。抛砖引玉希望大牛看到这种代码可以给我指条明路,告诉我我需要学什么。。。 如果有Exception的话就是这两个数不能确定一组数,实在是写的太糙了不会改了。。 基本思路就是 根据异或以及两数之和可以确定一族二进制数 比如 26 -- 11010 36 -- 100100 可以确定这样一族二进制数对 22121 1的意思为这一对二进制数从右数第一位和第三位都为1 2的意思为这一对二进制数在该位上存在一个1与一个0 0的意思(在这里没有出现)这一对数在该位都是0 | | 31 11111 5 00101 29 11101 7 00111 23 10111 13 01101 21 10101 15 01111 所以可见22121描述了以上的四对数 假设有N个2的话,那么就有 2^(N-1)对符合要求的数字(因为要固定一个2) 我说不太清楚,如果不吝赐教请尽情站内,先谢过了。。。附丑陋代码 public class XorSum { static int length = 10; //手动的输入一下二进制容器的大小 static int x = 26, s = 36; //异或,两数之和 public static void main(String[] args) { //将异或以及两数之和变为二进制 int[] xb = new int[length], sb = new int[length]; int[] rawResult = new int[length]; for (int i = 0; i < length; i++) rawResult[i] = 8; xb = toBinary(x); sb = toBinary(s); //下面是混乱的开始。。。。 int[] carry = new int[length]; for (int i = 0; i < length; i++) carry[i] = 8; for(int i = length-1; i >= 0; i--) { if(xb[i] == 1) { rawResult[i] = 2; if(sb[i] == 0) carry[i+1] = 1; else if(sb[i] == 1) carry[i+1] = 0; } if((xb[i] == 0) && (sb[i] == 1)) { if(carry[i+2] == 1) carry[i+1] = 1; } if((xb[i] == 8) && (sb[i] == 1)) carry[i+1] = 1; } if (xb[length-1] == 0) { if(sb[length - 1] == 1) { System.out.println("Doesn't Exist!"); } if(carry[length-1] == 0) rawResult[length-1] = 0; else if(carry[length-1] == 1) rawResult[length-1] = 1; } for(int i = length-2; i >= 0; i--) { if(xb[i] == 0) { if(carry[i] == 1) { if(carry[i+1] == 0) { if(sb[i] == 1) rawResult[i] = 0; else if(sb[i] == 0) rawResult[i] = 1; } else if(carry[i+1] == 1) { if(sb[i] == 1) { rawResult[i] = 1; } else if(sb[i] == 0) { System.out.println("Doesn't Exist!"); } } } else if(carry[i] == 0) { if(sb[i] == 1) rawResult[i] = 1; else if(sb[i] == 0) rawResult[i] = 0; } } } //接下来把上面生成原始答案变成可读的 int j; for (j = 0; rawResult[j] != 2; j++) ; rawResult[j] = 3; System.out.println(); makeResult(rawResult); } public static int[] toBinary(int num) { int[] n = new int[length]; for (int i = 0; i < length; i++) n[i] = 8; int i = 9; num <<= 1; while ((num >>= 1) != 0) { n[i--] = num & 1; } return n; } //这个虽然不太好看,但是功能还是基本正确的,返回值没有意义,return只是用来结束函数的 public static int makeResult(int[] raw) { int i; for (i = 0; (raw[i] != 2) && (i < length); i++) if(i == length - 1) { int sumUp = 0, sumDown = 0, count = 0, multi = 0; for (int digi: raw) { multi = length - 1 - count++; if(digi == 1) { sumUp += Math.pow(2,multi); sumDown += Math.pow(2,multi); } else if(digi == 3) { sumUp += Math.pow(2,multi); } else if(digi == 4) { sumDown += Math.pow(2,multi); } } System.out.println(sumUp + " " + sumDown); return 0; } raw[i] = 3; int[] rawCopy = new int[length]; for (int j = 0; j < length; j++) rawCopy[j] = raw[j]; //由于不会按值传递,所以就这么丑陋的解决一下 makeResult(raw); rawCopy[i] = 4; makeResult(rawCopy); return 0; } }
shenlei机器人#3 · 2013/5/22
考虑: a+b=a&b<<1+a^b 【 在 simpleon (SimplePlan) 的大作中提到: 】 : 写了一个极其恶心的将就能用的。。。抛砖引玉希望大牛看到这种代码可以给我指条明路,告诉我我需要学什么。。。 : 如果有Exception的话就是这两个数不能确定一组数,实在是写的太糙了不会改了。。 : 基本思路就是 : ...................
Hemingway机器人#4 · 2013/5/22
【 在 lovemaker 的大作中提到: 】 : 已知两个数的异或 和 两个数的和(只考虑正整数) : 是否能唯一确定这两个数,如果不能,列出所有可能的数值对 : 输入是十进制数[eg xor:26 sum:36],输出也是十进制数[eg [31,5],[29,7],[23,13],[21,15]]。 public class xorSum { /** * @param args * @author xiaomingli */ public static void main(String[] args) { // TODO Auto-generated method stub int xor=26,sum=36,x,y; for(x=1;x<sum;x++) for(y=x;y<sum;y++) if(x+y==sum && (x^y) ==26 ) System.out.println("["+x+","+y+"]"); } }
Hemingway机器人#5 · 2013/5/22
【 在 lovemaker 的大作中提到: 】 : 已知两个数的异或 和 两个数的和(只考虑正整数) : 是否能唯一确定这两个数,如果不能,列出所有可能的数值对 : 输入是十进制数[eg xor:26 sum:36],输出也是十进制数[eg [31,5],[29,7],[23,13],[21,15]]。 public class xorSum { /** * @param args * @author xiaomingli */ public static void main(String[] args) { // TODO Auto-generated method stub int xor=26,sum=36,x,y; for(x=1;x<sum;x++) for(y=x;y<sum;y++) if(x+y==sum && (x^y) ==xor ) System.out.println("["+x+","+y+"]"); } }
Ron机器人#6 · 2013/5/22
明神V587 【 在 Hemingway 的大作中提到: 】 : [color=#00008B][code=java] : public class xorSum { : /** : ...................
Hemingway机器人#7 · 2013/5/22
【 在 Ron 的大作中提到: 】 : 明神V587 无聊就瞎写了个,泰哥。点评下,嘻嘻
Ron机器人#8 · 2013/5/23
求别黑了,我这水平你又不是不知道。。。 【 在 Hemingway 的大作中提到: 】 : 无聊就瞎写了个,泰哥。点评下,嘻嘻
wyq机器人#9 · 2013/5/23
我也是这么想的。。 【 在 Hemingway (枫の哀觞) 的大作中提到: 】 : [color=#00008B][code=java] : public class xorSum { : /** : ...................