GameSprit

自転車やMac・AppleScript、映画・小説やドラマのレビュー、備忘メモ・クイズなどを置いています。

AppleScript : 多数桁の0以上の整数同士の足し算

2007-11-18 22:58:25 | AppleScript
AppleScript を使って、多数桁の0以上の整数同士の足し算を行なってみます。

GameSprit AppleScript : 文字列操作 に AppleScript での文字列操作について記載しました。

ここでは、この AppleScript での文字列操作と、そろばんでの足し算の仕組みを利用して、多数桁の0以上の整数同士の足し算を行なってみます。


そろばん(英名:Abacus)は計算補助器具で、数字の5をあらわす五珠とそれぞれが数字の1をあらわす一珠4つが並んだひとつ縦軸で一桁をあらわします。五珠と一珠を区切る梁には、そろばんの真ん中を基準として左右とも端まで定位点が打たれています。この定位点は昔は4桁毎に打たれていましたが、国際化が進んだせいか今はどうも3桁毎に打たれているようです。そういえば、数字も一般的には「100,0000,0000」というように表記されていました... 口頭で聞いてそろばんをはじく場合には4桁区切りの方がイメージをつかみやすいような気がします。

ところで、このそろばん(の珠が)日本の文化に反映されていて たとえば硬貨や紙幣は5円玉・50円玉・500円玉・5,000円札と1円玉・10円玉・100円玉・1,000円札・10,000円札が発行されています。欧米では25単位の硬貨(クォーター)が発行されていて文化の違いを感じさせます。


そろばんでの足し算の方法ですが、最大の特徴は桁数がいくらあろうとも一桁の足し算の積み重ねで達成できることです。(筆算もそうです)また、そろばんの場合は繰り上がりが機械的かつビジュアルに処理できます。

ここでは、数字を文字列とし、一文字毎に一桁の足し算を行ない、繰り上がりがあれば処理しています。



set a to "11111111111111"
set b to "99999999999999"

try --エラー処理
set ans to calcplus(a, b)
dd(ans)
on error
return "error"
end try

on calcplus(a, b)
-- 入力された値「a」(例:123)を逆順の文字列として「al」(例:"321")に代入する。
-- 「b」についても同様に処理する。
set al to reverse of characters of (a as string)
set bl to reverse of characters of (b as string)

-- 桁数を確認し、最大の桁数を「maxlength」に代入する。
set lenal to length of al
set maxlength to length of al
set lenbl to length of bl
set tmplength to length of bl
if maxlength <tmplength then set maxlength to tmplength -- 初期値設定
set i to 1
set ans to ""
set kuriagari to 0

-- 一桁目から最大桁まで、一桁ずつ足し算を行なってゆく。繰り上がり処理を行なう。
repeat with i from 1 to maxlength
if lenal set tmpchara to (item i of bl as integer) + kuriagari
else if lenbl set tmpchara to (item i of al as integer) + kuriagari
else
set tmpchara to (item i of al as integer) + (item i of bl as integer) + kuriagari
end if

-- 一桁目からの計算結果を「ans」に代入してゆく。
set ans to ans & item 1 of reverse of characters of (tmpchara as string)

-- 一桁毎の足し算の結果が「9」を超えた場合は、
-- 繰り上がりとして「kuriagari」に「1」を代入する。
if tmpchara > 9 then
set kuriagari to 1
else
set kuriagari to 0
end if

end repeat

-- 最大桁で繰り上がりが残ったときには、その一桁上を(繰り上がりの)「1」とする。
if kuriagari = 1 then set ans to ans & "1"

-- 「ans」には逆順で答えが入っているため、(例:「9000 + 1000」の答えの「00001」)
-- さらに逆順にする。
set ans to reverse of characters of ans as string
return ans

end calcplus

on dd(msg)
display dialog msg
end dd

-- Mac OS X Leopard 10.5.1 on Intel Mac mini




ソースよりも桁数を増やして足し算してみました。





最新の画像もっと見る

post a comment

ブログ作成者から承認されるまでコメントは反映されません。