[問題] 想請問flash高手...這程式哪裡出問題?

看板Flash作者 (喵)時間19年前 (2006/11/19 11:20), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/8 (看更多)
最近教學教到比與比值 但是學生對於比化成最簡單整數比很不熟練 想說要設計程式讓電腦出題並且幫我改答案 可是出現一個問題.... 首先我先自定一個函數是找出兩個整數的最大公因數如下 function gcd(int1,int2) { a=Math.max(int1,int2); b=Math.min(int1,int2); while(a%b!=0){ c=a-Math.floor(a/b)*b; a=b; b=c; } return b; } 這裡我並沒有特別限制int1和int2要整數(要整數才可以找最大公因數) 但是因為是自己要用的 所以自己注意一下就好了 接著我想要電腦亂數幫我取兩個數 然後產生出類似0.3:0.21這樣的題目 所以我先取 t1=random(31)+1; t2=random(31)+1; s1=t1/gcd(t1,t2); s2=t2/gcd(t1,t2); 這裡產生出的s1和s2就是最原始的最簡單整數比,也就是答案 然後取一個倍數 multi=random(31)+1; q1=s1*multi; q2=s2*multi; 產生出題目q1和q2的原始整數值,也就是說最後學生要用multi這個數字約分 接著因為要變成小數,題目預計是"一位小數:兩位小數" 所以要先將q1除以10,q2除以100,然而此時答案的最簡單整數比應該會改變 所以再將s1和s2重新設定為q1*100和q2*100, 並產生新的答案ss1和ss2 q1=q1/10; q2=q2/100; s1=q1*100; s2=q2*100; ss1=s1/gcd(s1,s2); ss2=s2/gcd(s1,s2); 基本上在大多數的狀況下這樣的設計是沒問題的 可是我在進行測試的時候 會發生一些問題 我透過下列程式進行測試 ****開新檔案後 在影格一之中放入下列程式碼******************* ****並測試影片 數秒後關掉測試影片看看trace出來的東西************* stop(); //兩數的最大公因數函數 function gcd(int1,int2) { a=Math.max(int1,int2); b=Math.min(int1,int2); while(a%b!=0){ c=a-Math.floor(a/b)*b; a=b; b=c; } return b; } _root.onEnterFrame=function () { t1=random(31)+1; t2=random(31)+1; s1=t1/gcd(t1,t2); s2=t2/gcd(t1,t2); trace("1.原始最簡單整數比前項="+s1); trace("2.原始最簡單整數比後項="+s2); multi=random(31)+1; q1=s1*multi; q2=s2*multi; q1=q1/10; trace("3.原始小數題目前項="+q1); q2=q2/100; trace("4.原始小數題目後項="+q2); s1=q1*100; trace("5.新的最簡單整數比前項"+s1); s2=q2*100; trace("6.新的最簡單整數比後項"+s2); trace("7.用新的最簡單整數比求出最大公因數="+gcd(s1,s2)); ss1=s1/gcd(s1,s2); trace("8.本題最後的答案前項="+ss1); ss2=s2/gcd(s1,s2); trace("9.本題最後的答案後項="+ss2); trace(""); } **************************************** 結果會出現下列這樣子的狀況(當然也會有正常的狀況) 1.原始最簡單整數比前項=26 2.原始最簡單整數比後項=1 3.原始小數題目前項=67.6 4.原始小數題目後項=0.26 5.新的最簡單整數比前項6760 6.新的最簡單整數比後項26 7.用新的最簡單整數比求出最大公因數=9.09494701772928e-13 8.本題最後的答案前項=7.43269860376576e+15 9.本題最後的答案後項=28587302322176 天啊 最大公因數怎麼會出現這種東西呢?? 第七條的最大公因數是從6760和26求出來的 但是實際去做 6760和26的最大公因數是26才對啊 我覺得應該是輸入進gcd自定函數中的兩個變數有問題 因此我把gcd函數變成下列這樣子 function gcd(int1,int2) { //加了下列兩行程式碼 int1=Math.round(int1); int2=Math.round(int2); a=Math.max(int1,int2); b=Math.min(int1,int2); while(a%b!=0){ c=a-Math.floor(a/b)*b; a=b; b=c; } return b; } 結果就沒出現這樣的問題了 可是 即使我沒強制讓int1和int2是整數 原本輸入進去的數字也是整數啊 基本上若要沒有問題 好像只要將gcd的函數變成後面這個就可以了 可是 我還是很好奇,到底是哪個環節出錯了, 讓gcd最後判斷出來的最大公因數有問題... 不曉得有沒有人了解我的問題所在呢? 有人可以幫忙看看到底是哪裡出問題了嗎? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.15.61 ※ 編輯: jonathanmeow 來自: 220.141.15.61 (11/19 12:08)
文章代碼(AID): #15Nyrq5h (Flash)
討論串 (同標題文章)
文章代碼(AID): #15Nyrq5h (Flash)