LoginSignup
6
4

More than 5 years have passed since last update.

【Ruby】理論的には無限桁の乗算が可能な計算機

Last updated at Posted at 2015-10-17

学生プログラマの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

今後の展望

今後、累乗についてのメソッドもまとめ、割り算のクラスも作ってπの計算とかに役立てたいなと思います。
最後まで読んでいただいた方、ありがとうございました。
よろしければコメントも残していただけると嬉しいです。

6
4
3

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
6
4