[問題] 想請問flash高手...這程式哪裡出問題?
最近教學教到比與比值
但是學生對於比化成最簡單整數比很不熟練
想說要設計程式讓電腦出題並且幫我改答案
可是出現一個問題....
首先我先自定一個函數是找出兩個整數的最大公因數如下
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)
討論串 (同標題文章)
完整討論串 (本文為第 1 之 8 篇):
Flash 近期熱門文章
PTT數位生活區 即時熱門文章