mind8 で大きな10進数を計算
事務処理用に必要な10進数計算のmind単語を作成します。
まず非負整数の加減算と乗算です。
構造体を使った長整数型の定義
※タイトル 長整数をmind独自で定義し計算する。(現在 非負整数の加算のみ実装)
L整数型は 型紙
L数字は 変数
L桁数は 変数
全体は L桁数と 100個の L数字。
L数値変換とは
W整数は 構造体 L整数型
W文字列は 文字列実体
W文字列に 入れる
W文字列の 文字数を W整数の L桁数に 入れる
W文字列の 文字数 回数指定し
W文字列から 一文字右側切り出し
一文字数値変換し 捨て W整数の L数字(回数)に 入れる
繰り返す
W整数を 返す。
L文字列変換とは
W整数は 構造体 L整数型
W文字列は 文字列実体
W桁数は 変数
W桁は 変数
W整数に 入れる
W文字列を クリアする
W整数の L桁数を W桁数に 入れる
W桁数を W桁に 入れる
W桁数 回数指定し
W整数の L数字(W桁)を 文字列変換し
W文字列に 追加する
W桁を 一つ減少
繰り返す
W文字列を 返す。
繰り上がり、繰り下がり、先頭のゼロ抑止
L繰り上がり処理とは (L整数 → L整数)
W整数は 構造体 L整数型
W桁数は 変数
W桁は 変数
W商は 変数
W余は 変数
W整数に 入れる
W整数の L桁数を W桁数に 入れる
W桁数から 一つ引いて 回数指定し
W整数の L数字(回数)が 9 以下
ならば もう一度
つぎに
W整数の L数字(回数)を 10での 余りと商をとり
W整数の L数字(回数)と W商に 入れる
回数に 一つ加え W桁に 入れる
W整数の L数字(W桁)を W商だけ 増加する
繰り返す
ここから
W整数の L数字(W桁数)が 10 以上
ならば
W整数の L数字(W桁数)を 10での 余りと商をとり
W整数の L数字(W桁数)と W商に 入れる
W桁数を 一つ増加し
W商を W整数の L数字(W桁数)に 入れる
さもなければ
打ち切り
つぎに
繰り返す
ここから
W桁数が 2 以上
かつ
W整数の L数字(W桁数)が 0と 等しい
ならば W桁数を 一つ減少する
さもなければ
打ち切り
つぎに
繰り返す
W桁数を W整数の L桁数に 入れる
W整数を 返す。
加算処理
L加算結果とは (L整数、L整数 → L整数)
W整数Aは 構造体 L整数型
W整数Bは 構造体 L整数型
W整数Cは 構造体 L整数型
W桁数Aは 変数
W桁数Bは 変数
W和は 変数
W桁数Cは 変数
W整数Aと W整数Bに 入れる
W整数Aの L桁数を W桁数Aに 入れる
W整数Bの L桁数を W桁数Bに 入れる
W桁数Aが W桁数B 以上
ならば W桁数Aを
さもなければ
W桁数Bを
つぎに
W桁数Cに 入れる
W桁数Cを W整数Cの L桁数に 入れる
W桁数C 回数指定し
W和を クリアする
W桁数Aが 回数 以上
ならば W整数Aの L数字(回数)だけ W和を 増加し
つぎに
W桁数Bが 回数 以上
ならば W整数Bの L数字(回数)だけ W和を 増加し
つぎに
W和を W整数Cの L数字(回数)に 入れる
繰り返す
W整数Cを L繰り上がり処理し 返す。
減算処理
L減算結果とは (L整数、L整数 → L整数) ※答えが負の場合は未対応
W整数Aは 構造体 L整数型
W整数Bは 構造体 L整数型
W整数Cは 構造体 L整数型
W桁数Aは 変数
W桁数Bは 変数
W和は 変数
W桁数Cは 変数
W整数Aと W整数Bに 入れる
W整数Aの L桁数を W桁数Aに 入れる
W整数Bの L桁数を W桁数Bに 入れる
W桁数Aが W桁数B 以上
ならば W桁数Aを
さもなければ
W桁数Bを
つぎに
W桁数Cに 入れる
W桁数Cを W整数Cの L桁数に 入れる
W桁数C 回数指定し
W和を クリアする
W桁数Aが 回数 以上
ならば W整数Aの L数字(回数)だけ W和を 増加し
つぎに
W桁数Bが 回数 以上
ならば W整数Bの L数字(回数)だけ W和を 減少し
つぎに
W和を W整数Cの L数字(回数)に 入れる
繰り返す
W整数Cを L繰り上がり処理し 返す。
掛け算の処理
L掛け算結果とは (L整数、L整数 → L整数)
W整数Aは 構造体 L整数型
W整数Bは 構造体 L整数型
W整数Cは 構造体 L整数型
W桁数Aは 変数
W桁数Bは 変数
W桁は 変数
W整数Aと W整数Bに 入れる
W整数Aの L桁数を W桁数Aに 入れる
W整数Bの L桁数を W桁数Bに 入れる
W桁数Aに W桁数Bを 加え 一を引いて W整数Cの L桁数に 入れる
W整数Cの L桁数 回数指定し
W整数Cの L数字(回数)を クリアする
繰り返す
W桁数A 回数指定し
W桁数B 回数指定し
外側回数と 回数を 加え 一つ引いて W桁に 入れる
W整数Aの L数字(外側回数)と
W整数Bの L数字(回数)を 掛け
W整数Cの L数字(W桁)を 増加する
繰り返す
繰り返す
W整数Cを L繰り上がり処理し 返す。
テスト用の処理
メインは ( ・ --> ・ )
L整数1は 構造体 L整数型
L整数2は 構造体 L整数型
L整数3は 構造体 L整数型
W文字列は 文字列実体
「2つの自然数の足し算をします。(空入力で終了)」と 表示し 改行し
ここから
「自然数1=」と 表示し
文字列入力し W文字列に 入れる
W文字列が 空列?
ならば 打ち切り
つぎに
W文字列を L数値変換し L整数1に 入れる
「自然数2=」と 表示し
文字列入力し L数値変換し L整数2に 入れる
L整数1と L整数2の L加算結果を L整数3に 入れる
「 和=」と 表示し L整数3を L文字列変換し 表示し 改行する
L整数1と L整数2の L減算結果を L整数3に 入れる
「 差=」と 表示し L整数3を L文字列変換し 表示し 改行する
L整数1と L整数2の L掛け算結果を L整数3に 入れる
「 積=」と 表示し L整数3を L文字列変換し 表示し
改行する
繰り返す。
実行結果
c:\mind8\pmind\sample>lnum
2つの自然数の足し算をします。(空入力で終了)
自然数1=1111111111111
自然数2=1111111111111
和=2222222222222
差=0
積=1234567901234320987654321
自然数1=123456789
自然数2=1234
和=123458023
差=123455555
積=152345677626
自然数1=123456789
自然数2=12345678
和=135802467
差=111111111
積=1524157763907942
自然数1=1234567890
自然数2=123456789
和=1358024679
差=111111111-9
積=152415787501905210
減算結果が一部おかしいですね!
これを直せたら、今後の計画は
負の数を扱えるようにする。
割り算を実装。
小数を実装。(これは時間が掛かるかも)
繰り下がりの処理が抜けてました
L繰り上がり処理とは (L整数 → L整数)
W整数は 構造体 L整数型
W桁数は 変数
W桁は 変数
W商は 変数
W余は 変数
W値は 変数
W整数に 入れる
W整数の L桁数を W桁数に 入れる
W桁数から 一つ引いて 回数指定し
W整数の L数字(回数)が 10 以上
ならば
W整数の L数字(回数)を 10での 余りと商をとり
W整数の L数字(回数)と W商に 入れる
回数に 一つ加え W桁に 入れる
W整数の L数字(W桁)を W商だけ 増加する
もう一度
つぎに
W整数の L数字(回数)が 0より 小さい
ならば
W整数の L数字(回数)に -1を 掛け 一を引いて
10での 余りと商をとり W余りと W商に 入れる
W商に 一つ加え W値に 入れる
回数に 一つ加え W桁に 入れる
W整数の L数字(W桁)を W値だけ 減少する
W値に 10を 掛け W値に 入れ
W整数の L数字(回数)を W値だけ 増加し
つぎに
繰り返す
ここから
W整数の L数字(W桁数)が 10 以上
ならば
W整数の L数字(W桁数)を 10での 余りと商をとり
W整数の L数字(W桁数)と W商に 入れる
W桁数を 一つ増加し
W商を W整数の L数字(W桁数)に 入れる
さもなければ
打ち切り
つぎに
繰り返す
ここから
W桁数が 2 以上
かつ
W整数の L数字(W桁数)が 0と 等しい
ならば W桁数を 一つ減少する
さもなければ
打ち切り
つぎに
繰り返す
W桁数を W整数の L桁数に 入れる
W整数を 返す。
途中の桁が負の場合の繰り下がりを加えました。
実行結果
c:\mind8\pmind\sample>mind lnum file
日本語プログラミング言語 Mind Version 8.10 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9\pmind\bin\mindex.exe --> lnum.exe
c:\mind8\pmind\sample>lnum
2つの自然数の足し算をします。(空入力で終了)
自然数1=12340
自然数2=1234
和=13574
差=11106
積=15227560
自然数1=1234567890
自然数2=123456789
和=1358024679
差=1111111101
積=152415787501905210