質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2283閲覧

N(>2)進法の足し算について

manman

総合スコア233

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

4クリップ

投稿2015/05/17 02:41

以下のように3進法で足し算を行おうとしました。

lang

1irb(main):001:0> a = 4 2=> 4 3irb(main):002:0> b = 2 4=> 2 5irb(main):003:0> a = a.to_s(3) 6=> "11" 7irb(main):004:0> b = b.to_s(3) 8=> "2" 9irb(main):005:0> a + b 10=> "112" 11irb(main):006:0> (a.to_i(3) + b.to_i(3)).to_s(3) 12=> "20"

a + b で思った結果がかえってこなかったので、
(a.to_i(3) + b.to_i(3)).to_s(3)で計算しました。

一般にN(>2)進法の計算するには、
.to_i(N)→計算→.to_s(N)
としないとダメなのでしょうか?
もっと簡単にできないのでしょうか?

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

n 進数というのは、 整数を文字列として表記するときの事です。
数値演算処理は常に 整数として処理 をする必要があります。

a.to_s(3), b.to_s(3) の結果はいずれも 文字列なので
a.to_s(3) + b.to_s(3) は 文字列としての + 演算処理となります。
整数としての演算にはなりません。

"1 + 10" を計算するとき、通常は 10 進でおこないます。
これは、
"1" を 10 進数で解釈したときの整数値 + "10" を 10 進数で解釈したときの整数値
の結果を 10
進数で表す
を行い "11" を得ることになります。
ruby のコードで書けば
("1".to_i(10) + "10".to_i(10)).to_s(10)
ということです。

異なる N 進表記の値同士を演算して、その結果をさらに異なる N 進表記で表すということも可能です。
(10.to_i(10) + 10.to_i(2)).to_s(3)
=> (10 + 2).to_s(3)
=> 12.to_s(3)
=> "110"

時間の表示は単純な N 進ではありません。
"1:23:59" (1時間 23 分 59 秒) + "0:0:2" (2秒) を計算する場合は
時分秒の表記を 秒だけでの値に変換してから, 秒の単位で数値演算をし、その結果を 時分秒 の表示にします。
(1 * 60 * 60 + 23 * 60 + 59) 秒 + 2 秒
=> (3600 + 1380 + 59) + 2 秒
=> (5039 + 2) 秒
=> 5041 秒
=> (3600 + 1441) 秒
=> 3600 + 24 + 60 + 1 秒
=> 1:23:01 (1時間23分1秒)

数値の表示と 数値の値は別のものだということは普段は明確に意識していないですが、
コンピューターでの計算の場合は常に区別をすることが必要です。

投稿2015/05/17 10:05

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manman

2015/05/17 10:20

文字列と数値の区別が大切だとわかりました。例えば、(12359)11の次の次の数を次のように計算しました。 irb(main):001:0> ('12359'.to_i(11)+2).to_s(11) => "12360"
guest

0

ベストアンサー

a.to_s(3)の結果は文字列なので、+は文字列同士の連結になってしまいます。

Rubyでは(他のほとんどの言語でも)3進法の計算は出来ません。一旦は2進法に直して計算することになります。

.to_i(N)→計算→.to_s(N)
としないとダメなのでしょうか?

そうですね。

そういうクラスを作ればいいかと思います。

lang

1class Sanshin 2 attr_reader :value 3 def initialize(x) 4 case x 5 when Numeric 6 @value = x 7 when String 8 @value = x.to_i(3) 9 end 10 end 11 def +(other) 12 case other 13 when Sanshin 14 Sanshin.new(@value + other.value) 15 when Numeric 16 Sanshin.new(@value + other) 17 when String 18 Sanshin.new(@value + other.to_i(3)) 19 end 20 end 21 def to_s 22 @value.to_s(3) 23 end 24 def inspect 25 to_s 26 end 27end 28def Sanshin(x) 29 Sanshin.new(x) 30end 31 32a = Sanshin(3) 33b = Sanshin(2) 34p a+b #=> 12

投稿2015/05/17 03:00

otn

総合スコア84551

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manman

2015/05/17 03:11

(細かいことを申し上げて悪いのですが、)2行目「一旦は2進法に直して計算することになります。」は「一旦は3進法に直して計算することになります。」ではないでしょうか?
manman

2015/05/17 03:13

書かれているとおりです。私の勘違いでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問