平方根を中学高校生仕様に処理する関数を考える1
~中学高校生仕様に平方根を処理してみる1~
プログラムは大人仕様なので普通に計算してしまうとどうなるかというと例えば√6だと2.4・・と小数点で答えが返ってきてしまうので 今回は学生仕様で計算できるようにjavascriptで関数を作っておきます。
長くなってしまいそうなので今回はその第一回です。
レベル1 平方根の単体の計算方法
例えば√24だと2で割ると12ですよね。そこで同じ2で割ると6ですよね。
すると計算結果は2√6となります。
つまり2から順番に割っていって同じ数で割れたらその数を平方根の外に出してやって残りは平方根の中に残せばいいってことになります。
そこで再び2から順番に割っていって・・・
と同じ処理をしていって同じ数で割れなくなったらプログラム処理をストップすればいいことになります。
レベル2 √32の場合を計算してみる
平方根を√aにしてみます。
例aが32の場合
32を2から順番に割っていく(32の半分16以下の数字まで順番に) ↓↓↓↓↓ 2で割り切れる 32÷2=16 ↓↓↓↓↓ それを再び2と同じ数字2で割る 16÷2=8 ↓↓↓↓↓ それが割り切れた場合割った残りは32÷2÷2=8 ↓↓↓↓↓ 割り切れた数字2を配列に入れる ↓↓↓↓↓ 残った8を再び2から割っていくということをします。
プログラムにするとこうなります。
var a=32; var insu=[]; for(var count=2; count<=Math.trunc(a/2);count++){ if((a/count)%count==0){ insu.push(count); a=a/count/count; count=1; } } alert(insu); }
まずcount変数を2からはじめてa以下だった場合countを1ずつ増やしてます。
for(var count=2; count<=a;count++){ //ループする処理内容 }
次にaをcountで割ってさらに同じ数字countで割って余りが0なら
共通因数としてcountを配列insu[]に入れてます。
そして割った答えを再びaに入れてcountを1に戻してそれをループさせていきます。
countを1に戻すことでfor文ではcount2から始まります。
for(var count=2; count<=a/2;count++){ if((a/count)%count==0){ insu.push(count); a=a/count/count; count=1; } }
すると今回はa=32なので
32÷2÷2=8
8÷2÷2=2
となりinsu[0]には2,insu[1]には2が入ります。
全て割った答え残り2がaに入ります。
レベル3 答えをもとめる
共通因数の配列insu[]に入ってる数字を全てかけてそれを平方根の外に出してあげます
残ったaを平方根の中に入れます。
var insuans=1;
for(var i=0;i;i++){
insuans =insuans*insu[i];
}
alert("求める答えは"+insuans+"√"+a+"です。");
レベル4 平方根のたし算
関数にしたいのでheihoutasu(a,b,c,d,e,f)にして
\[ \frac{b\sqrt{c}}{a}+ \frac{e\sqrt{f}}{d} \]として関数を作ります。
また数値のない時は0を引数とする。
一方が分数でもう一方が整数の時は整数の方の分母を1とする。
まず例えば
\[ 2\sqrt{12}=4\sqrt{3} \]になるようにします、
レベル5 2√12=4√3のようにする
function heihoutasizan(a,b,c,d,e,f) { var kotei_a=a; var kotei_b=b; var kotei_c=c; var kotei_d=d; var kotei_e=e; var kotei_f=f; //cについての処理 var insu_c=[]; for(var count_c=2; count_c<=c;count_c++){ if((c/count_c)%count_c==0){ insu_c.push(count_c); c=c/count_c/count_c; count_c=1; } } var insuans_c=1; for(var i=0;i;i++){ insuans_c =insuans_c*insu_c[i]; } //求めるcは"insuans_c√cになっている。 //bはb*insuans_cに変える。 b=b*insuans_c; //fについての処理 var insu_f=[]; for(var count_f=2; count_f<=f;count_c++){ if((f/count_f)%count_f==0){ insu_f.push(count_f); f=f/count_f/count_f; count_f=1; } } var insuans_f=1; for(var i=0;i ;i++){ insuans_f =insuans_f*insu_f[i]; } //求めるfは"insuans_f√fになっている。 //eはe*insuan_sfに変える。 e=e*insuans_f;
レベル6 足し算と通分をする
\[ \frac{b\sqrt{c}}{a}+ \frac{d\sqrt{f}}{e} \]のc,fが同じになってたら足し算する
かつ
分数であれば通分もする。
絶対値Math.absを使うことで-計算にも対応しました。
if(f==c){ //どちらも分数になっていない時 if(a==0 && c==0){ //答えの平方根の外 var ans_left=b+d; //答えの平方根の中 var ans_right=c; } //どちらも分数になっている時 else if(a !==0 && c!==0){ //最小公倍数を求める if(Math.abs(a)i ;i++){ var minkoubai =insuans*insu2[i]; } //minkoubaiが最小公倍数 //通分した分母 var tubun_bottom=a*d*minkoubai; //通分した分子 var tubun_top=(tubun_bottom/kotei_a*b)+(tubun_bottom/kotei_d*e); //答えの平方根の外 var ans_left=(tubun_top+"/"+tubun_bottom); //答えの平方根の中 var ans_right=c; } } alert(ans_left+"√"+ans_right); }
かなり大変なのでまた続きは後でかきます。
ここまでプログラムは順調に動いてます。
レベル7 分数部分の約分をする
絶対値Math.absを使うことで-計算にも対応してます
if(Math.abs(tubun_bottom)
var tubun_min=Math.abs(tubun_bottom);
}
else{
var tubun_min=Math.abs(tubun_top);
}
for(var count=2; count<=tubun_min;count++){
if(tubun_top%count==0 && tubun_bottom%count==0){
tubun_top=tubun_top/count;
tubun_bottom=tubun_bottom/count;
count=1;
if(Math.abs(tubun_top)
tubun_min=Math.abs(tubun_top);
}
else{
tubun_min=Math.abs(tubun_bottom);
}
}
レベル8 cとfが異なっている時の処理
else if(f !==c){ //2項をそれぞれ約分してそのまま答え(b/aとe/d) if(Math.abs(a)for(var count=2; count<=min;count++){ if(a%count==0 && b%count==0){ a=a/count; b=b/count; count=1; if(Math.abs(a) for(var count=2; count<=min;count++){ if(d%count==0 && e%count==0){ d=d/count; e=e/count; count=1; if(Math.abs(d) min=Math.abs(d); } else{ min=Math.abs(e); } } } var ans_left=(b+"√"+c+"/"+a+"+"); var ans_right=(e+"√"+f+"/"+d); }//else if(f !==c)exit
レベル9 √の前の一方が整数、もう一方が分数になっている時の時の処理
√の前の一方が整数、もう一方が分数になっている時の時の処理です。
//√の前の一方が整数、もう一方が分数になっている時 else if(a ==0 || d ==0){ if(a==0){ //d,eの約分 if(dfor(var count=2;count<=min;count++){ if(d%count==0 && e%count==0){ d=d/count; e=e/count; if(d for(var count=2;count<=min;count++){ if(a%count==0 && b%count==0){ a=a/count; b=b/count; if(a min=a; } else{ min=b; } count=1; } } var tubun_bottom=a; var tubun_top=e*a+b; } var ans_left=(tubun_top+"/"+tubun_bottom); var ans_right=("√"+c); }//else if(a ==0 || d ==0){exit
レベル10 実際にみんなに計算してもらう
ついに完成しました。
みなさん計算してみて下さい。
\[ \frac{b\sqrt{c}}{a}+ \frac{e\sqrt{f}}{d} \]整数の時はaとかdを0にして下さい
aを入力して下さい。(マイナスOK)bを入力して下さい。
cを入力して下さい。
dを入力して下さい。(マイナスOK)
eを入力して下さい。
fを入力して下さい。