VBGood網站全文搜索 Google

搜索VBGood全站網頁(全文搜索)

VB愛好者樂園(VBGood)

 找回密碼
 立即注冊
搜索
查看: 2062|回復: 27
打印 上一主題 下一主題

[求助] VB 解多元一次方程中如何用二進制數的思路進行位移、運算,來求解

[復制鏈接]
跳轉到指定樓層
1
發表于 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. }
復制代碼

評分

參與人數 1威望 +10 收起 理由
bruly + 10 很給力

查看全部評分

回復 支持 1 反對 0

使用道具 舉報

推薦
發表于 2019-9-19 16:18:56 | 只看該作者
直接用邏輯運算不行嗎?

評分

參與人數 1威望 +10 收起 理由
bruly + 10 贊一個

查看全部評分

回復 支持 1 反對 0

使用道具 舉報

2
發表于 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
復制代碼
回復 支持 反對

使用道具 舉報

3
 樓主| 發表于 2019-9-18 14:09:16 | 只看該作者

請看上面的運算規則是 異或運算:0+0=0,0+1=1,1+1=0
您代碼中的:X1 + X2 + X3 = 1  肯定不符合要求,它默認的是十進制加法,不是異或運算。
回復 支持 反對

使用道具 舉報

4
 樓主| 發表于 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萬個循環來算,速度就跟不上了。
回復 支持 反對

使用道具 舉報

5
發表于 2019-9-19 09:33:21 | 只看該作者
bruly 發表于 2019-9-18 14:11
另外,這種有多少個未知數,就循環多少次的算法,我自已是會的,方法是:
for x1=0 to 1
for x2=0 to ...

位運算的話,用C語言更方便吧= =# VB的位運算是個渣渣
回復 支持 反對

使用道具 舉報

6
發表于 2019-9-19 10:52:45 | 只看該作者
bruly 發表于 2019-9-18 14:11
另外,這種有多少個未知數,就循環多少次的算法,我自已是會的,方法是:
for x1=0 to 1
for x2=0 to ...

你這計算不對,需要用括號。最終結果就只有一個符合的。就是1111。
回復 支持 反對

使用道具 舉報

9
 樓主| 發表于 2019-9-19 23:14:12 | 只看該作者

C語言中也是窮舉法來 計算嗎?
如果這樣,那么當未知數有1萬個的時候,會不會變得很慢呢?
回復 支持 反對

使用道具 舉報

10
 樓主| 發表于 2019-9-19 23:23:56 | 只看該作者
luogege 發表于 2019-9-19 16:18
直接用邏輯運算不行嗎?

老師您用邏輯運算,具體怎么寫代碼呢,感謝指點~
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

GMT+8, 2020-2-5 19:58

VB愛好者樂園(VBGood)
快速回復 返回頂部 返回列表
广西快3开奖结果直播 广东好彩1基本号码图 欢乐斗牛棋牌游戏下 网赚兼职论坛 学生网上赚钱 急速赛车单机 河南快赢481走势图最近30期 股票技术指标分析 下载麻将游戏免费四人 2020年三中三来一组 黑龙江6+1开奖结果查询今天