VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 646|回复: 27

[求助] VB 解多元一次方程中如何用二进制数的思路进行位移、运算,来求解

[复制链接]
发表于 2019-9-17 15:53:23 | 显示全部楼层 |阅读模式
已知方程组有4个未知数 x1, x2, x3, x4,它们的值不是1就是0;两每两个数的运算法则是:0+0=0,0+1=1,1+1=0. 求该方程组的解。
        x1 + x2 +  x3 = 1
        x1 + x2  + x4 = 1
        x1 + x3  + x4 = 1
        x2 + x3  + x4 = 1

我们可以把四个未知数连在一起变成一个4位数,并且是二进制的数,则该数一定在:0000-1111之间。
那么如何对该二进制数进行位移i消元、最后运算出方程的解呢?
          附:上面四个未知数的解,都是1。
发表于 2019-9-22 19:37:26 | 显示全部楼层
bruly 发表于 2019-9-22 16:59
方程组中,每一个方程等于号的右边的常数值,永远都等于1,表示左边不论是哪几个未知数相加(最少3个相 ...

最好把你原始的问题发出来,而不是给出经过你“简化”后的问题,因为你的简化可能不正确,或者不包含原问题的部分信息。

评分

参与人数 1威望 +9 收起 理由
bruly + 9 赞一个

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-23 11:03:13 | 显示全部楼层
bruly 发表于 2019-9-21 17:06
得出一个解就知足了。
        就是算法的问题。据说改成二进制思维,会很快,几秒或几分钟的事。而穷举 ...

如此的话,还是算法问题,我给你说个方向考虑,你打印出一部分方程数目的所有解出来,在这些解中找出一个通用解,或者说是规律解,然后才能考虑你说的移位运算,要不然你移位的格式是什么?我这几天比较忙,有时间也帮你想想,你先考虑看吧。

评分

参与人数 1威望 +10 收起 理由
bruly + 10 赞一个

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-19 11:01:06 | 显示全部楼层
  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.         for(int i=0;i<16;i++){
  5.                 if(
  6.                         ((8&i)>0)^((4&i)>0)^((2&i)>0)&&
  7.                         ((8&i)>0)^((4&i)>0)^((1&i)>0)&&
  8.                         ((8&i)>0)^((2&i)>0)^((1&i)>0)&&
  9.                         ((4&i)>0)^((2&i)>0)^((1&i)>0)
  10.                 ){
  11.                         printf("%d%d%d%d\n",(8&i)>0,(4&i)>0,(2&i)>0,1&i);
  12.                 }
  13.         }
  14.         return 0;
  15. }
复制代码

TIM截图20190919110051.jpg

评分

参与人数 1威望 +10 收起 理由
bruly + 10 很给力

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-19 16:18:56 | 显示全部楼层
直接用逻辑运算不行吗?

评分

参与人数 1威望 +10 收起 理由
bruly + 10 赞一个

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-9-18 11:22:53 | 显示全部楼层
好像并不成立啊
  1. Private Sub Command1_Click()
  2.     For X1 = 0 To 1
  3.         For X2 = 0 To 1
  4.             For X3 = 0 To 1
  5.                 For X4 = 0 To 1
  6.                     If X1 + X2 + X3 = 1 Then
  7.                         If X1 + X2 + X4 = 1 Then
  8.                             If X1 + X3 + X4 = 1 Then
  9.                                 If X2 + X3 + X4 = 1 Then
  10.                                     Print X1 & X2 & X3 & X4
  11.                                 End If
  12.                             End If
  13.                         End If
  14.                     End If
  15.                 Next
  16.             Next
  17.         Next
  18.     Next
  19. End Sub
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-18 14:09:16 | 显示全部楼层

请看上面的运算规则是 异或运算:0+0=0,0+1=1,1+1=0
您代码中的:X1 + X2 + X3 = 1  肯定不符合要求,它默认的是十进制加法,不是异或运算。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-18 14:11:26 | 显示全部楼层
本帖最后由 bruly 于 2019-9-18 14:15 编辑


另外,这种有多少个未知数,就循环多少次的算法,我自已是会的,方法是:
for x1=0 to 1
for x2=0 to 1
for x3=0 to 1
for x4=0 to 1
      if x1 xor x2 xor x3  and   x1 xor x2 xor x4  and    x1 xor x3 xor x4  and    x2 xor x3 xor x4  then           
         print x1, x2 x3 x4
      end if
next
next
next
next

但不是最佳的运算思路。因为可以把答案看成是二进制数来处理。
同时,如果我有题目改成是1万个未知数,那么用1万个循环来算,速度就跟不上了。
回复 支持 反对

使用道具 举报

发表于 2019-9-19 09:33:21 | 显示全部楼层
bruly 发表于 2019-9-18 14:11
另外,这种有多少个未知数,就循环多少次的算法,我自已是会的,方法是:
for x1=0 to 1
for x2=0 to ...

位运算的话,用C语言更方便吧= =# VB的位运算是个渣渣
回复 支持 反对

使用道具 举报

发表于 2019-9-19 10:52:45 | 显示全部楼层
bruly 发表于 2019-9-18 14:11
另外,这种有多少个未知数,就循环多少次的算法,我自已是会的,方法是:
for x1=0 to 1
for x2=0 to ...

你这计算不对,需要用括号。最终结果就只有一个符合的。就是1111。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-19 23:14:12 | 显示全部楼层

C语言中也是穷举法来 计算吗?
如果这样,那么当未知数有1万个的时候,会不会变得很慢呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-19 23:23:56 | 显示全部楼层
luogege 发表于 2019-9-19 16:18
直接用逻辑运算不行吗?

老师您用逻辑运算,具体怎么写代码呢,感谢指点~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2019-11-13 07:59

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表