福野泰介の一日一創 - create every day

プログラミングで学ぶ算数、筆算アルゴリズムを実装せよ

2018/05/30
#IchigoJam #KidsIT 

SDGs、プログラミングできる子供が増えれば、だいたいなんとかなるかも?
学校で必修化されるプログラミングは、日本の大きなチャンス!
本日、福井県立福井南特別支援学校国立福井大学附属義務教育学校へ訪問。

義務教育学校の算数の先生の「大きな素数を考えよう」というおもしろそうな課題。
素数かどうか判定するアプリを自作されたとのことですが、もうちょっとおもしろくしたいとのご相談。

単純な計算が合ってるかどうかは電卓で確認できますが、電卓にも限界があります。そんなときこそコンピューターとプログラミングの出番!

どういう手順で素数かどうか判定したらいいかを考え、実際にプログラミングして確かめると理解が深まります。

前提:素数とは、その数より小さく、2以上の数で割り切れない数。
思いつきの判定手順
1. 2で割ってみる。割り切れたら素数じゃない。
2. 3で割ってみる。割り切れたら素数じゃない。
...(以後、その数-1まで繰り返し)

で、判定できそう!と思いついたとしたら、実際プログラミングしてます。

10 INPUT A 20 B=2 30 IF A%B=0 ?"NOT SOSU...";B:END 40 B=B+1 50 IF B=A ?"SOSU!":END 60 GOTO 30

できたら、試してみましょう(RUN on IchigoJam web - ブラウザでも動かせます!)

RUN ?20 NOT SOSU...";2 OK RUN ?17 SOSU! OK

1777は素数でしょうか?実は、この考え方だと結構答が出るまでに時間がかかります。
考えてみると、その数-1まで律儀にみなくても素数かどうかの判定はできるかも!?
思いついたら即プログラミング!合ってるかどうかもまた自分で分かります。

この「考え方」が「アルゴリズム」と呼ばれる、プログラミングの真髄です!

この判定プログラムは、IchigoJamの限界、32767を超えてしまうと使えません。
そんな時、大きな数を扱う新たなアルゴリズムをつくりましょう。

答を書いてしまってもつまらないので、ここでは筆算を用いた大きな数の掛け算までを例示します。

(RUN on IchigoJam web) ブラウザ上で動きます!

とりあえず、画面に数式を表示します

10 CLS 20 LC8,0:?" 123456" 30 LC8,1:?"x 7" 40 LC8,2:?"--------"

6x7、5x7、、、と順に掛け算していきますね。まずは値を画面から取得してみます。

50 B=SCR(15,1)-48 60 A=SCR(15,0)-48 RUN ?A,B 6 7

48とはASC("0")、0を表すキャラクターコードなので、引くとその場所の数が分かります。

計算して1桁かいてみます

70 C=A*B 80 LC15,3:?C%10

あまりを求めるIchigoJam BASICの演算子「%」を使って、1桁計算できました。

繰り上がりを変数Dにいれつつ、変数Iを使った繰り返しで、大きな数 x 1桁の数 の筆算ができます。

55 I=15:D=0 65 IF A<0 GOTO110 80 LCI,3:?C%10 90 D=C/10 95 I=I-1 100 GOTO 60 110 IF D LCI,3:?D

20行、30行の問題をいろいろ変えて試してみましょう。

つづいて、複数桁 x 複数桁に対応してみます。例えば139で掛けてみます。

20 LC8,0:?" 123456" 30 LC8,1:?"x 139"

一桁ずつの計算を1つずつずらして表示します。

45 J=15 50 B=SCR(J,1)-48 52 IF B<0 END 80 LCI+J-15,3+15-J:?C%10 110 IF D LCI+J-15,3+15-J:?D 120 J=J-1 130 GOTO 50

最後に、縦の列を足し算すれば完成です!

52 IF B<0 GOTO140 140 LC8,3+15-J:?"--------" 150 I=15:C=0:L=3+15-J+1 160 J=3 170 A=SCR(I,J)-48:IF A<0 A=0 180 C=C+A 190 J=J+1:IF J<L-1 GOTO170 200 IF C=0 END 210 LCI,L:?C%10:C=C/10 220 I=I-1:GOTO160

じっくり時間を掛けて、自分のものにしてください。

大きな素数を判定するアルゴリズムづくり、挑戦してみよう!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image