LoginSignup
3
1

日本語プログラミング言語Mind8で十進数計算(符号付長整数計算)

Last updated at Posted at 2024-04-21

Mind独自の長整数を定義し四則演算するプログラム

入力データの型チェックや桁あふれなどの例外処理は、未実装です。

長整数型定義と部品

L整数型は 型紙
	L符号は ワード変数
 	L数字は 変数
	L桁数は 変数
	全体は L符号と L桁数と 100個の L数字。

L数値変換とは
		W整数は 構造体 L整数型
    W文字列は 文字列実体
	W文字列に 入れる
	W文字列の 左端文字で 事例をとり
      '-'なら  '-'を
      '-'なら  '-'を
			例外なら	'+'を
	事例終わり
			W整数の L符号に 入れる
	W文字列の 文字数を W整数の L桁数に 入れる
	W文字列の 左端文字が '-'と 等しい
  または
	W文字列の 左端文字が '-'と 等しい
	または
	W文字列の 左端文字が '+'と 等しい
	または
	W文字列の 左端文字が '+'と 等しい
		ならば W整数の L桁数を 一つ減少し
		つぎに
	W整数の L桁数 回数指定し
		W文字列から 一文字右側切り出し 
		一文字数値変換し 捨て W整数の L数字(回数)に 入れる
	繰り返す
	W整数を 返す。

L文字列変換とは
		W整数は 構造体情報
		W文字列は 文字列実体
		W桁数は 変数
		W桁は 変数
	W整数に 入れる		
	W文字列を クリアする
	W整数の L符号を W文字列に 一文字追加し
	W整数の L桁数を W桁数に 入れる
	W桁数を W桁に 入れる
	W桁数 回数指定し
		W整数の L数字(W桁)を 文字列変換し
		W文字列に 追加する
		W桁を 一つ減少
	繰り返す
	W文字列を 返す。
 
整数をL整数に変換とは (数値 → L整数)
	文字列変換し L数値変換し 返す。

Lゼロは (L整数)
	 "0"を L数値変換し 返す。

大小比較、部分数字列抽出など

L大小比較とは (L整数、L整数 → 1/0/-1)
		W整数Aは 構造体情報
    W整数Bは 構造体情報
		W桁数Aは 変数
		W桁数Bは 変数
    W桁は   変数
	W整数Aと W整数Bに 入れる
	W整数Aの L桁数を W桁数Aに 入れる
	W整数Bの L桁数を W桁数Bに 入れる
	W桁数Aが W桁数Bより 大きい
		ならば 1を 返し 終わり
		つぎに
	W桁数Bが W桁数Aより 大きい
		ならば -1を 返し 終わり
		つぎに
	W桁数Aを W桁に 入れる
	W桁数A 回数指定し
		W整数Aの L数字(W桁)が W整数Bの L数字(W桁)より 大きい
			ならば  1を 返し 終わり
			つぎに
		W整数Aの L数字(W桁)が W整数Bの L数字(W桁)より 小さい
			ならば  -1を 返し 終わり
			つぎに
		W桁を 一つ減少する
	繰り返す
	0を 返す。
L指定桁数の上位部分整数とは (L整数、数値 → L整数)
		W桁数Aは 変数
		W整数Aは 構造体情報
		W整数Bは 構造体 L整数型
		W桁数Bは 変数
    W桁Aは  変数
    W桁Bは  変数	
	W整数Aと W桁数Bに 入れる 
  W整数Aの L桁数を W桁数Aに 入れる
  W桁数Bが W桁数Aより 大きい
		ならば W桁数Aを W桁数Bに 入れる
		つぎに
  W桁数Aを W桁Aに 入れる
	W桁数Bを W桁Bに 入れる
	W桁数B 回数指定し
		W整数Aの L数字(W桁A)を 
        W整数Bの L数字(W桁B)に 入れる
		W桁Aを 一つ減少する
		W桁Bを 一つ減少する
	繰り返す
  W桁数Bを W整数Bの L桁数に 入れる
	W整数Bを 返す。       

前ゼロ抑止,繰り上がり処理

L前ゼロ抑止とは (L整数 → L整数)
        W整数は 構造体  L整数型
		W桁数は 変数
	W整数に 入れる
	W整数の L桁数を W桁数に 入れる 	
	ここから		
    W桁数が 2 以上
		かつ
    W整数の L数字(W桁数)が 0と 等しい
			ならば	W桁数を 一つ減少する
			さもなければ
				打ち切り
			つぎに
	繰り返す  
	W桁数を W整数の L桁数に 入れる
	W整数を 返す。
       
L繰り上がり処理とは (L整数 → L整数)
        W整数は 構造体情報
		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整数を 返す。       

正数の加算、減算

L正数の加算結果とは (L整数、L整数 → L整数)
    W整数Aは 構造体情報
    W整数Bは 構造体情報
		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符号に 入れる
  W整数Cを L繰り上がり処理し 返す。

L正数の減算結果とは  (L整数、L整数 → L整数) 
		W整数Aは 構造体情報
  	W整数Bは 構造体情報
		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は 構造体情報
    W整数Bは 構造体情報
		W整数Cは 構造体 L整数型
		W整数Aの絶対値は 構造体 L整数型
    W整数Bの絶対値は 構造体 L整数型
		W大小は 変数
	W整数Aと W整数Bに 入れる
	W整数Aを W整数Aの絶対値に 入れる
  W整数Aの絶対値の L符号に '+'を 入れる
	W整数Bを W整数Bの絶対値に 入れる
  W整数Bの絶対値の L符号に '+'を 入れる
	W整数Aの L符号と W整数Bの L符号が 等しい
		ならば W整数Aの絶対値と W整数Bの絶対値の L正数の加算結果を
				W整数Cに 入れる
				W整数Aの L符号を W整数Cの L符号に 入れる
		さもなければ
				W整数Aの絶対値と W整数Bの絶対値の L大小比較し
				W大小に 入れる
				W大小が 0と 等しい
					ならば Lゼロを 返し 終わり
					つぎに
				W大小が 1と 等しい
					ならば W整数Aの絶対値から W整数Bの絶対値の
						 	L正数の減算結果を W整数Cに 入れる		 
							W整数Aの L符号を W整数Cの L符号に 入れる

					さもなければ
							W整数Bの絶対値から W整数Aの絶対値の
						 	L正数の減算結果を W整数Cに 入れる		 
							W整数Bの L符号を W整数Cの L符号に 入れる
					つぎに
		つぎに
  W整数Cを 返す。

L減算結果とは  (L整数、L整数 → L整数) ※答えが負の場合は未対応
    W整数Aは 構造体情報
    W整数Bは 構造体情報
		W整数Cは 構造体 L整数型
		W整数Aの絶対値は 構造体 L整数型
    W整数Bの絶対値は 構造体 L整数型
		W大小は 変数
	W整数Aと W整数Bに 入れる
	W整数Aを W整数Aの絶対値に 入れる
  W整数Aの絶対値の L符号に '+'を 入れる
	W整数Bを W整数Bの絶対値に 入れる
  W整数Bの絶対値の L符号に '+'を 入れる
	W整数Aの L符号と W整数Bの L符号が 異なる
		ならば W整数Aの絶対値と W整数Bの絶対値の L正数の加算結果を
				W整数Cに 入れる
				W整数Aの L符号を W整数Cの L符号に 入れる
		さもなければ
				W整数Aの絶対値と W整数Bの絶対値の L大小比較し
				W大小に 入れる
				W大小が 0と 等しい
					ならば Lゼロを 返し 終わり
					つぎに
				W大小が 1と 等しい
					ならば W整数Aの絶対値から W整数Bの絶対値の
						 	L正数の減算結果を W整数Cに 入れる		 
							W整数Aの L符号を W整数Cの L符号に 入れる

					さもなければ
							W整数Bの絶対値から W整数Aの絶対値の
						 	L正数の減算結果を W整数Cに 入れる
							W整数Aの L符号が '+'と 等しい
								ならば '-'を
								さもなければ
										'+'を
								つぎに		 
												W整数Cの L符号に 入れる

					つぎに
		つぎに
  W整数Cを 返す。

掛け算

L掛け算結果とは (L整数、L整数 → L整数)
    W整数Aは 構造体情報
    W整数Bは 構造体情報
		W整数Cは 構造体 L整数型
		W桁数Aは 変数
		W桁数Bは 変数
    W桁は   変数
	W整数Aと W整数Bに 入れる
	W整数Aの L桁数を W桁数Aに 入れる
	W整数Bの L桁数を W桁数Bに 入れる
	W整数Aの L符号と W整数Bの L符号が 等しい
		ならば '+'を
		さもなければ '-'を
		つぎに
				W整数Cの L符号に 入れる	
	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整数と整数の掛け算結果とは (L整数、整数 → L整数)
    W整数Aは 構造体情報
    W整数Bは 変数
		W整数Cは 構造体 L整数型
		W桁数Aは 変数
	W整数Aと W整数Bに 入れる
	W整数Aの L桁数を W桁数Aに 入れる
	W桁数Aを W整数Cの L桁数に 入れる
	W桁数A 回数指定し
    W整数Aの L数字(回数)と W整数Bを 掛け 
    W整数Cの L数字(回数)に 入れる
	繰り返す
	 '+'を W整数Cの L符号に 入れる
 	W整数Cを L繰り上がり処理し 返す。

割り算

一桁目に挿入とは (整数、L整数 → L整数)
		W余りは 構造体情報
    W挿入数は 変数
  	N桁は 変数
		N次の桁は 変数
	W挿入数と W余りに  入れる          
	W余りの L桁数を N桁に 入れる
	N桁が 1と 等しく
	かつ
  W余りの L数字(1)が 0と 等しい
		ならば W挿入数を W余りの L数字(1)に 入れる
        終わり
		つぎに              
	W余りの L桁数を 回数指定し
		N桁に 一つ加え N次の桁に 入れる
    W余りの L数字(N桁)を 
		W余りの L数字(N次の桁)に 入れる
 		N桁を 一つ減少する
 	繰り返す		
	W挿入数を W余りの L数字(1)に 入れる
	W余りの L桁数を 一つ増加する。

L正数の余りと商とは (L整数、L整数 → L整数、L整数)
		W整数Aは 構造体情報
		W整数Bは 構造体情報
		W整数Cは 構造体 L整数型
		W整数Xは 構造体 L整数型
		W余は  構造体 L整数型
		W商は 構造体 L整数型
		NAは 変数
		NBは 変数
		Dは  変数
    桁数Eは  変数
        iは 変数
		W桁は  変数
	W整数Aと W整数Bに 入れる
	W整数Aの L桁数を NAに 入れる
	W整数Bの L桁数を NBに 入れる 
	NAが NBより 小さい
		ならば
			W整数Aと Lゼロを 返し 終わり		
		つぎに   
	W整数Aの NBだけ L指定桁数の上位部分整数を W整数Cに 入れる 
  W整数Cと W整数Bを L大小比較し  0 以上
		ならば [D := NA - NB + 1 ]
				[桁数E := NB]
		さもなければ
				[D := NA - NB ]
				[桁数E := NB + 1]
		つぎに
	Dが 0と 等しい
		ならば W整数Aと Lゼロを 返し 終わり
		つぎに
  W整数Aの 桁数Eだけ  L指定桁数の上位部分整数を W余りに 入れる
    W余りの L符号に '+'を 入れる
	W商を クリアする
	Dを W商の L桁数に 入れる
	 W商の L符号に '+'を 入れる
	D 回数指定し
		[i := D - 回数 + 1]
		W商の L数字(i)に 9を 入れる
		9 回数指定し
      W整数Bと 回数の L整数と整数の掛け算結果を W整数Xに 入れる	
    	W整数Xと W余りを L大小比較し 1と 等しい
				ならば 回数から 一つ引いて W商の L数字(i)に 入れる		
						打ち切り
				つぎに
		繰り返す
		W整数Bと W商の L数字(i)の L整数と整数の掛け算結果を
    W整数Xに 入れる
	 	W余りから W整数Xを L正数の減算結果を W余りに 入れる
		iが 2 以上
			ならば 
				iから 一つ引いて W桁に 入れる
            	W整数Aの L数字(W桁)を W余りに 一桁目に挿入し
			つぎに
	繰り返す
	W余と W商を 返す。

L余りと商とは (L整数、L整数 → L整数、L整数)
		W整数Aは 構造体情報
		W整数Bは 構造体情報
		W整数Aの絶対値は 構造体 L整数型
    W整数Bの絶対値は 構造体 L整数型
		符号Aは ワード変数
		符号Bは ワード変数
		W余は 構造体 L整数型
		W商は 構造体 L整数型
	W整数Aと W整数Bに 入れる
	W整数Aを W整数Aの絶対値に 入れる
  W整数Aの絶対値の L符号に '+'を 入れる
	W整数Bを W整数Bの絶対値に 入れる
  W整数Bの絶対値の L符号に '+'を 入れる 
	W整数Aの絶対値を W整数Bの絶対値の 
  	L正数の余りと商を W余りと W商に 入れる  
	W整数Aの L符号が '+'と 等しい
		ならば
			W整数Bの L符号が '+'と 等しい
				ならば '+'を W余りの L符号に 入れる
            '+'を W商の L符号に 入れる
				さもなければ
            '+'を W余りの L符号に 入れる
            '-'を W商の L符号に 入れる
				つぎに
		さもなければ
			W整数Bの L符号が '+'と 等しい
				ならば '-'を W余りの L符号に 入れる
            '-'を W商の L符号に 入れる
				さもなければ
            '-'を W余りの L符号に 入れる
            '+'を W商の L符号に 入れる
				つぎに
		つぎに
	W余と W商を 返す。  

テスト

L整数1は 構造体 L整数型。
L整数2は 構造体 L整数型。
L整数3は 構造体 L整数型。
L整数4は 構造体 L整数型。
L整数5は 構造体 L整数型。
L整数6は 構造体 L整数型。
L整数7は 構造体 L整数型。

メインは        ( ・ --> ・ )
  W文字列は 文字列実体
	「2つの自然数の四則演算をします。(空入力で終了)」と 表示し 改行し
	ここから
		「自然数1=」と 表示し
         文字列入力し W文字列に 入れる
		W文字列が 空列?
			ならば 打ち切り
			つぎに
 		W文字列を L数値変換し L整数1に 入れる
		「自然数2=」と 表示し
			文字列入力し W文字列に 入れる
		W文字列を L数値変換し L整数2に 入れる
			L整数1と L整数2の L加算結果を L整数3に 入れる
		「   和=」と 表示し L整数3を L文字列変換し 表示し 改行する
			L整数1と L整数2の L減算結果を L整数4に 入れる
		「   差=」と 表示し L整数4を L文字列変換し 表示し 改行する
			L整数1と L整数2の L掛け算結果を L整数5に 入れる
		「   積=」と 表示し L整数5を L文字列変換し 表示し 改行し
			L整数1と L整数2の L余りと商を L整数6と L整数7に 入れる	 		「   商=」と 表示し L整数7を L文字列変換し 表示し
		「 余=」と 表示し L整数6を L文字列変換し 表示し
		 改行する		
	繰り返す。

実行結果

日本語プログラミング言語 Mind Version 8.10 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\mind9\pmind\bin\mindex.exe --> lnumh2.exe

c:\mind8\pmind\sample>lnumh2
2つの自然数の四則演算をします。(空入力で終了)
自然数1=11111111111111
自然数2=11111111
   和=+11111122222222
   差=+11111100000000
   積=+123456788888887654321
   商=+1000000 余=+111111
自然数1=123456789
自然数2=123456789
   和=+246913578
   差=+0
   積=+15241578750190521
   商=+1 余=+0
自然数1=123456789
自然数2=234567
   和=+123691356
   差=+123222222
   積=+28958888625363
   商=+526 余=+74547
自然数1=234567
自然数2=526
   和=+235093
   差=+234041
   積=+123382242
   商=+445 余=+497
自然数1=123382242
自然数2=74547
   和=+123456789
   差=+123307695
   積=+9197775994374
   商=+1655 余=+6957
自然数1=3
自然数2=-2
   和=+1
   差=+5
   積=-6
   商=-1 余=+1
自然数1=-3
自然数2=2
   和=-1
   差=-5
   積=-6
   商=-1 余=-1
自然数1=-3
自然数2=-2
   和=-5
   差=-1
   積=+6
   商=+1 余=-1

割り算の余りについて

mindの処理単語「余りと商」に合わせて、負数の余りを使っています。

3
1
5

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