| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2060 人关注过本帖
标题:求这个方程组~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:100 回复次数:8 
求这个方程组~
求这样的一个方程组,也就是求下列x,y,z的值

程序代码:
{
    (x&y)==4352;
    (x|y)==55647;

    (x&z)==8;
    (x|z)==671102;

    (y&z)==2050;
}


这样的方程组怎么解,不知道除了穷举外还有没有什么好方法?



PS:用穷举解了很久也解不出来,然后发现a&b==k这样判断出问题了~
(a&b)==k这就行了,题目上方为了不要误解就把()加上了,到底一个一个穷举还是……算了~


[此贴子已经被作者于2018-6-30 12:08编辑过]

搜索更多相关主题的帖子: 方程组 穷举 方法 判断 
2018-06-30 09:55
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:100 
x|y|x|z == x|y|z == 720255

z
720255&~(x|y) == z(和 x y 不同为1的bit) == 664608
664608|2050|8 == z == 666666

y
720255&~(x|z) == y(和 x z 不同为1的bit) == 49153
49153|4352|2050 == 55555

x
720255&~(z|y) == x(和 y z 不同为1的bit) == 84
84|8|4352 == 4444

==========
手抖 2050 写成 22050

[此贴子已经被作者于2018-6-30 11:57编辑过]


https://zh.
2018-06-30 11:16
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 lin5161678


结果对了,标记一下,慢慢看

以下是引用lin5161678在2018-6-30 11:16:57的发言:

x|y|x|z == x|y|z == 720255

z
720255&~(x|y) == z(和 x y 不同为1的bit) == 664608
664608|22050|8 == z == 666666


PS:那个22050其实是2050吧,我在看具体解法原理


~

[此贴子已经被作者于2018-6-30 11:31编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-30 11:28
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 lin5161678
我一步一步来理解一下,其实首先是根据

a|b=s1
a|c=s2

那么有

a|b|c=s1|s2

根据

x|y和
x|z


这样先把x,y,z,包含的bit求出来

然后再把z的bit分成三部分组成一个是和x公共的bit,一个是和y公共的bit,还有一部分是自己独立的bit
独立的bit可以用(x|y|z)&~(x|y)求出
因为有x&z,和y&z这两个条件,固可以求出z和x和y的公共部分,三部分的bit合起来就是所求的z

至于x和y也类似,也是分成三部分来求就可以了~

一句一句看我能看懂,但合在一起理解还感觉挺神奇的~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-30 12:05
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
这题目挺有意思的

https://zh.
2018-06-30 12:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用lin5161678在2018-6-30 12:09:58的发言:

这题目挺有意思的

是的,如果这样就到此为止我感觉还挺浪费的~

我还打算变通一下如果最后条件(y&z)==2050这个条件改成(y|z)==720171那是否还有类似的解法呢?

应该有的,看上去就像求并集和差集那样,我也在想,要么一起来试一下~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-30 12:27
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是引用九转星河在2018-6-30 12:27:33的发言:


是的,如果这样就到此为止我感觉还挺浪费的~

我还打算变通一下如果最后条件(y&z)==2050这个条件改成(y|z)==720171那是否还有类似的解法呢?

应该有的,看上去就像求并集和差集那样,我也在想,要么一起来试一下~


找到方法了,要经过一系列转换才行具体代码如下,求得z=666666~
程序代码:
#include<stdio.h>

int main( void )
{
    const unsigned xAy=4352;
    const unsigned xOy=55647;
    
    const unsigned xAz=8;
    const unsigned xOz=671102;
    
    const unsigned yOz=720171;
    
    const unsigned xOyOz=xOy|xOz;
    
    const unsigned xOzAyOz=xOz&yOz;
    
    const unsigned single_y=xOyOz&~(xOz);
    const unsigned single_z=xOyOz&~(xOy);
    
    const unsigned yAz=(yOz&~(single_y|single_z|xAy|xAz));
    
    const unsigned z=single_z|xAz|yAz;
    
    printf("%u\n",z);
    
    return 0;
}


[此贴子已经被作者于2018-6-30 14:45编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-30 13:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
有高玩用一些比较高级的解法弄出来了

a+b==(a&b)+(a|b)
a^b==(a&b)^(a|b)

再用一条简单公式
(a^b)^(a^c)==b^c

就这样知道了

x+y
x+z
y^z

的值了~

通过y^z和y&z的值可以反求y|z的值~
然后再联立原来的y&z得出y+z的值

最后就是直接解一个普通的三元一次方程就可以了~

这样的确容易理解很多~



[此贴子已经被作者于2018-6-30 14:57编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-06-30 14:55
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
a+b=(a&b)+(a|b)
a+b=(a^b)+2*(a&b)
a+b=-(a^b)+2*(a|b)

a&b=(a|b)-(a^b)
a|b=(a^b)+(a&b)
a^b=(a|b)-(a&b)

a&b=(a^b)^(a|b)
a|b=(a^b)^(a&b)
a^b=(a&b)^(a|b)

~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-07-01 13:31
快速回复:求这个方程组~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018924 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved