3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

日本語プログラミング言語MINDで十進数計算を行う

3
Last updated at Posted at 2024-04-17

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
3
1
19

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?