にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

Problem 16 -Ruby編-

2^15 = 32768 であり、これの各数字の合計は 3 + 2 + 7 + 6 + 8 = 26 となる。 同様にして、2^1000 の各数字の合計を求めよ。

Problem 16 - PukiWiki

番外編的な扱いで。
2の1000乗をCで扱うにはBignumを実装しなければならなさそう(またはOpenSSLのBNを使う?)だったので後回しにして、とりあえずRubyで手抜き実装してみた。
Rubyでは、

演算の結果が Fixnum の範囲内である場 合には Fixnum に変換され、逆に Fixnum の範囲を越える時には Bignum に拡張されます。

Bignum - Rubyリファレンスマニュアル

とのことなので、気にせず数値を突っ込めるというわけですね。

#! /usr/bin/env ruby
NUM_TIMES = 1000
a = (2 ** NUM_TIMES).to_s
sum = 0
a.size.times {|i| sum += a[i].chr.to_i }
puts sum

C言語に比べてコード量が格段に少ないです。LL恐るべし。

実行結果

$ ruby p16.rb
1366

ブコメより

zorio (2 ** 1000).to_s.split('').inject(0) do |s,n| s + n.to_i end

はてなブックマーク - Problem 16 -Ruby編- - にたまごほうれん草

一行で済みますね。split('')で一文字ずつ区切りになるというのは初めて知りました。