作者jonathanmeow (喵)
看板Flash
标题[问题] 想请问flash高手...这程式哪里出问题?
时间Sun Nov 19 11:47:47 2006
最近教学教到比与比值
但是学生对於比化成最简单整数比很不熟练
想说要设计程式让电脑出题并且帮我改答案
可是出现一个问题....
首先我先自定一个函数是找出两个整数的最大公因数如下
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)