查看完整版本: 請教一下四則運算的邏輯思路?
頁: [1] 2

lonercity 發表於 2020-3-3 06:42 AM

請教一下四則運算的邏輯思路?

?+?-?+?=8   ?+?*?-?=6  ?有3或4個 然後做加減乘除之後等式成立
?只能填1-9且不能重複
以上面例子 我輸入=8   =6
程式運算後自動給出?的數字 所有組合  
2+9-4+1=8   1+4*2-3=6
9+2-4+1=8   3+2*4-5=6
7+4-5+2=8   1+3*4-7=6
:                    :
:                    :
:                    :




<div></div>

gonewang123 發表於 2020-3-3 09:46 AM

Hello :

小弟資質駑鈍,how about 四層迴圈

for i1 = 0 to 9
   for i2= 0 to 9
       for i3 = 0 to 9
            for i4 = 0 to 9
                 if math expression equal
                 ....do something
                 式一,最多僅一解
                 式二,最多僅二解
            next i4
       next i3
   next i2
next i1

thank you

stephenwei_lu 發表於 2020-3-3 11:30 AM

我的想法也沒什麼思考.

scanf 讀幾個 運算單元 X
依序輸入 運算 單元
再輸入要得到的result
Y = X+1
Y就是你的for值的第一圈
這樣依序下去
可以判斷4則的優先權, 先處理一下


gonewang123 發表於 2020-3-3 05:39 PM

你是指
recursion ?

追加一些判斷式可以增加運算效率,找到答案的step (in loop)
就可以跳出,進行下一個。

其實我發現有個判斷式,但是應該沒什麼作用。
如果:  x1 ~ x4 當作輸出結果
有個關係:
4 <= sqrt(x1^2 + x2^2 + x3^2 + x4^2) <= 18

我只是來賺積分。。。

lonercity 發表於 2020-3-4 07:02 AM

本帖最後由 lonercity 於 2020-3-4 07:31 AM 編輯

gonewang123 發表於 2020-3-3 09:46 AM
Hello :

小弟資質駑鈍,how about 四層迴圈

以我舉的例子 式一 不可能只一組 解 我KEY的就三組了 式二也是還有 1-9是? 你只能輸入答案  就是=後面的數字  
輸入答案後 程式去運算出所有 ?可以有的組合 這些組合中?只能是數字1-9 且不重複
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

lonercity 發表於 2020-3-4 07:13 AM

stephenwei_lu 發表於 2020-3-3 11:30 AM static/image/common/back.gif
我的想法也沒什麼思考.

scanf 讀幾個 運算單元 X


我的想法也是 四則運算優先權先寫好。
求解的話 我是會用反向運算
例如: 1+3=4  當不知道1 3 兩數字在題目中是?? 而4是自己輸入的
我會反過來4-?-?=0   
設定好條件判斷把?1-9重複的砍掉 不然程式跑出一組 4-2-2=0 也算入一組答案
這樣應該能獲得所有答案
    ...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

gonewang123 發表於 2020-3-4 08:58 AM

lonercity 發表於 2020-3-4 07:02 AM static/image/common/back.gif
以我舉的例子 式一 不可能只一組 解 我KEY的就三組了 式二也是還有 1-9是? 你只能輸入答案  就是=後面的數 ...

Hi :

這樣是不是不小心又賺到一點積分了?。。。
我說的是四層迴圈,判斷一組解是在迴圈最內層喔。
是為了效率。
當然也是可以全部都掃描過,共 9^4 次判斷,也還好啦,以目前的PC硬體水準來講。
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

gonewang123 發表於 2020-3-4 09:22 AM

其實,我有點憂心。。。
我在想,在這邊我是不是忘記放個"0"在迴圈當中。
數字有可能是"0"嗎?
你的問題允許出現"0" ?

確認一下。{:31:}
thank you

lonercity 發表於 2020-3-4 11:17 AM

gonewang123 發表於 2020-3-4 09:22 AM static/image/common/back.gif
其實,我有點憂心。。。
我在想,在這邊我是不是忘記放個"0"在迴圈當中。
數字有可能是"0"嗎?


?是由程式算出 不重複的1-9 數字沒有0這個數  
等式後面的才是由USER輸入
?+?*?-?=8    這個8 你可以輸入 前面? 是程式跑完得出1-9中的數字(沒有0喔)且不能重複到
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

gonewang123 發表於 2020-3-4 01:33 PM

Well...

我想到另一個也許會比較有效率的方式。
你可以將方程式稍作整理。
譬如:
?+?-?+?=8 ,當中應該會先宣告 x1, x2, x3, x4 當作裡面的 "?" (各自依照順序)
其中 x3 (左數到右第三個),是屬於 "負",將他移到右邊(國中數學)
會變成, x1 + x2 + x4 = "8" + x3
當中的 "8",是一開始就指定的。
然後跑回圈。。。
由 x3 = 1 to 9 開始
當 x3 = 1,右邊是 "9"
此時左邊 :
x1 = 1 to 9
    x2 = 1 to 9
          x4 = 1 to 9
                 if (x1 + x2 + x4) >...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

gonewang123 發表於 2020-3-4 03:06 PM

另一個更有效率的方式。
我想到就是用 recursive 的方式。
依上述,也是將四個變數命名為: x1, x2, x3, x4
依照輸入:8,右邊整理成 8+x3

然後撰寫一個 recursion,目的是將一個數字依序拆成兩個數字
依照這個recursion,可以將,譬如:x3=1,右邊是 9
x1, x2, x4 當作三個空格:
sep(9) -> x1 = 1, x2 = 8 ,
但是因為 x4 = empty, 所以繼續 sep(x2) 就是 sep(8) -> x2 = 1, x4 = 7
返回得到:
繼續 x2 = 2, x4 = 6 ... 直到 x2 = 4 >...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

tryit244178 發表於 2020-3-5 08:33 AM

本帖最後由 tryit244178 於 2020-3-5 08:39 AM 編輯

2樓大大的方法不就可以了。要效率的話,也許可以參考Backtracking
http://www.csie.ntnu.edu.tw/~u91029/Backtracking.html

gonewang123 發表於 2020-3-5 03:19 PM

Hello :

感謝大大的支持,很有用的連結資源喔。
因為"小小"->我非資訊類科班,想請問是否有這種探討解問題方式的"演算法"的相關書籍可以參考?
類似網頁當中的"8皇后"問題。。。

小小感恩。。。

tryit244178 發表於 2020-3-5 09:28 PM

本帖最後由 tryit244178 於 2020-3-5 09:46 PM 編輯

gonewang123 發表於 2020-3-5 03:19 PM static/image/common/back.gif
Hello :

感謝大大的支持,很有用的連結資源喔。

應該有吧。大大你可以去圖書館找看看

關於你10樓的回答,我看了後有二項疑問
第一、移項後,應該還是要判斷該項是否重覆,我認為應該不會比較快
第二、 if (x1 + x2 + x4) >...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

gonewang123 發表於 2020-3-5 10:00 PM

tryit244178 發表於 2020-3-5 09:28 PM static/image/common/back.gif
應該有吧。大大你可以去圖書館找看看

關於你10樓的回答,我看了後有二項疑問


Hi :

你的點子不錯耶,用 Javascript 就可以初步驗證。
試試看下面的。。。不過order 是以 "負值"為主進行排列<!doctype html>

<html>
<head>
<meta charset="utf-8">
<title>Test</title>
<script>
function test1()
{
  let result = "";
  let count = 0;

  for (let i=1; i<10; i++) {
    for (let j=1; j<10; j++) {
      if (j===i)
        continue;

      for (let k=1; k<10; k++) {
        if (i===k || j===k)
          continue;

        for (let l=1; l<10; l++) {
          count++;
          if (i===l || j===l || k===l)
            continue;

          if (i+j-k+l===8)
            result += i + "+" + j + "-" + k + "+" + l + "/\n";
        }
      }
    }
  }

  result += "迴圈次數:" + count;
  document.getElementById("result1").value = result;
}

function test2()
{
  let result =  "";
  let count = 0;
  let right_val = 0;

  for (let i=1; i<10; i++) {
    right_val = 8 + i;
    for (let j=1; j<10; j++) {
      if (j > right_val || j==i)
        continue;

      for (let k=1; k<10; k++) {
        if (k==i || k===j || ( (j+k) > right_val) )
          continue;

        for (let l=1; l<10; l++) {
          count++;
          if ( l==i || l===j || l===k || ( (j+k+l) > right_val) )
            continue;

          if (k+j+l === right_val)
            result += k + "+" + j + "-" + i + "+" + l + "/\n";
        }
      }
    }
  }

  result += "迴圈次數:" + count;
  document.getElementById("result2").value = result;
}

function test()
{
  test1();
  test2();
}
</script>
</head>
<body>
<button onclick="test()">Test</button></br>
<textarea cols="10" rows="30" id="result1" spellcheck="false"></textarea>
<textarea cols="10" rows="30" id="result2" spellcheck="false"></textarea>
</body>
</html>...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>
頁: [1] 2