学生プログラマのdrumathです。
拙いコードなのでぜひ、改善策をご教授ください。
打倒、オーバーフロー
私はCでアルゴリズムを書くのが趣味なのですが、ある中学2年生のころ、フィボナッチ数列のアルゴリズムを完成させ、いざ、無限ループでどこまでいけるかチャレンジ!となったとき、そのプログラムはほんの数秒でオーバーフロー。あの時の思いは忘れません。もっと数字が流れるような様を見たかった・・・。あれから2年が経ち、Rubyに出会ってから配列操作の簡単さにまざまざと感じていました。
こんなに便利な配列です。これを使って計算機を作ってみたい!
なぜ。。。
Rubyの計算能力は破壊的で、99の10000乗とかフツーにこなせます。だから今回のような計算機はほとんど出る幕なんてありません。しかしRubyにも限界がありますのでもしそんなことはないとしても、なんとなく作りたくなってしまったというのが今の気持ちです。(実際作ってるときにインタラクティブRubyで2の1000乗を計算できたのにすごく驚きました。)
プログラム
さて問題のコードを下に示します。
kakezan.rb
class Kake
# Multiplication program
def multi(num1,num2)
num1=num1.split("")
num2=num2.split("")
num1=trance(num1)
num2=trance(num2)
result=Array.new
result=[]
num1.each_index { |i|
num2.each_index { |j|
if result[i+j]==nil then
result<<num1[i]*num2[j]
else
result[i+j]=result[i+j]+num1[i]*num2[j]
end
}
}
result=analysis(result)
return result
end
def trance(str_list)
str_list.each_index { |i|
str_list[i]=str_list[i].ord-48
}
return str_list
end
def analysis(result_list)
result_list.each_index { |i|
a=-(i+1)
if result_list[a]>9
if i+1==result_list.length then
tmp=result_list[a]/10
result_list[a]=result_list[a]%10
result_list.unshift(tmp)
else
tmp=result_list[a]/10
result_list[a]=result_list[a]%10
result_list[a-1]+=tmp
end
end
}
return result_list
end
end
tra=Kake.new
print "result>>",(tra.multi(ARGV[0],ARGV[1])).join
実行例
ruby kakezan.rb 13516851651351651516516581651651658165165165865165 651685468165165165869846151
result>>8808735796530186896147617621731013277207962534877197442328986784315360229915
今後の展望
今後、累乗についてのメソッドもまとめ、割り算のクラスも作ってπの計算とかに役立てたいなと思います。
最後まで読んでいただいた方、ありがとうございました。
よろしければコメントも残していただけると嬉しいです。