頁:
[1]
2
請教一下四則運算的邏輯思路?
?+?-?+?=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> 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 我的想法也沒什麼思考.
scanf 讀幾個 運算單元 X
依序輸入 運算 單元
再輸入要得到的result
Y = X+1
Y就是你的for值的第一圈
這樣依序下去
可以判斷4則的優先權, 先處理一下
你是指
recursion ?
追加一些判斷式可以增加運算效率,找到答案的step (in loop)
就可以跳出,進行下一個。
其實我發現有個判斷式,但是應該沒什麼作用。
如果: x1 ~ x4 當作輸出結果
有個關係:
4 <= sqrt(x1^2 + x2^2 + x3^2 + x4^2) <= 18
我只是來賺積分。。。 本帖最後由 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> 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> 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> 其實,我有點憂心。。。
我在想,在這邊我是不是忘記放個"0"在迴圈當中。
數字有可能是"0"嗎?
你的問題允許出現"0" ?
確認一下。{:31:}
thank you
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> 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> 另一個更有效率的方式。
我想到就是用 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:39 AM 編輯
2樓大大的方法不就可以了。要效率的話,也許可以參考Backtracking
http://www.csie.ntnu.edu.tw/~u91029/Backtracking.html
Hello :
感謝大大的支持,很有用的連結資源喔。
因為"小小"->我非資訊類科班,想請問是否有這種探討解問題方式的"演算法"的相關書籍可以參考?
類似網頁當中的"8皇后"問題。。。
小小感恩。。。 本帖最後由 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> 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