返回信息流已知两个数的异或 和 两个数的和(只考虑正整数)
是否能唯一确定这两个数,如果不能,列出所有可能的数值对
输入是十进制数[eg xor:26 sum:36],输出也是十进制数[eg [31,5],[29,7],[23,13],[21,15]]。
这是一条镜像帖。来源:北邮人论坛 / java / #25441同步于 2013/5/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
分享一个笔试题
lovemaker
2013/5/20镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
填空题么?
【 在 lovemaker (pt亲友团-->做爱做的事) 的大作中提到: 】
: 已知两个数的异或 和 两个数的和(只考虑正整数)
: 是否能唯一确定这两个数,如果不能,列出所有可能的数值对
: 输入是十进制数[eg xor:26 sum:36],输出也是十进制数[eg [31,5],[29,7],[23,13],[21,15]]。
: ...................
写了一个极其恶心的将就能用的。。。抛砖引玉希望大牛看到这种代码可以给我指条明路,告诉我我需要学什么。。。
如果有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;
}
}
考虑:
a+b=a&b<<1+a^b
【 在 simpleon (SimplePlan) 的大作中提到: 】
: 写了一个极其恶心的将就能用的。。。抛砖引玉希望大牛看到这种代码可以给我指条明路,告诉我我需要学什么。。。
: 如果有Exception的话就是这两个数不能确定一组数,实在是写的太糙了不会改了。。
: 基本思路就是
: ...................
【 在 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+"]");
}
}
【 在 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+"]");
}
}
明神V587
【 在 Hemingway 的大作中提到: 】
: [color=#00008B][code=java]
: public class xorSum {
: /**
: ...................
我也是这么想的。。
【 在 Hemingway (枫の哀觞) 的大作中提到: 】
: [color=#00008B][code=java]
: public class xorSum {
: /**
: ...................