1

インクリメントできる変数「num」を持ち、その基数を理解できるようにしたいと思います。

たとえば、num が底 7 で 66 に等しい場合、num+= 1 を実行すると、num を 100 に設定する必要があります。

1 つの解決策には to_s と to_i が含まれますが、非常に多くの変換が行われているため、あまり効率的ではないようです。

def increment_with_base(number, base)
  number_base_ten = number.to_s.to_i(base)
  number_base_ten += 1

  number_base_ten.to_s(base).to_i
end

これより適切なものはありますか?どの基数を使用しているかを Ruby に伝えることはできますか?

以下のコメントで述べたように、私は基数に非常に精通していますが、Ruby の基数ではありません。実際には、インクリメントされた各数値を表示する必要があります (そして、たくさんインクリメントします)。

質問に対する答えがわかっている場合は、この次の部分を読む必要はありません。ただし、なぜ私がやっていることをしているのかを明確にするために追加しました。詳細を知りたい場合を除き、以下を読む必要はありません。

詳細については、私が行っているのは、各ノードに 0 または 1 つの遷移しかない一連のグラフを生成することです。各ノードは数字で表され、特定の数字は有向エッジがある他のノードを表します。たとえば、数値 4.3.1.0 は 4 つのノードを持つグラフで、最初のノードは 4 番目のノードに対してエッジを持ち、2 番目は 3 番目のノードに対してエッジを持ち、3 番目は最初のノードに対してエッジを持ち、4 番目のノードは持っていません。遷移があります。

したがって、各ノードが 1 つのエッジしか持たない 4 つのノード グラフをすべて生成したい場合は、0.0.0.0 から 4.4.4.4 までカウントする必要があります。

4

2 に答える 2

2

基数は算術には関係ありません。数字は単なる数字であり、すべての基数はわずかに異なる表現方法です。たとえば、66 7 (x yは x が基数 y で書かれていることを意味します) は 48 10であり、それに 1 を足すときにどの基数を考えるかに関係なく、結果は常に同じ数になります: 100 7 = 49 10 = 31 16 = ...その他のベースについても同様です (黄金比ベースのような本当に奇妙なものも)。同じ操作で同じ結果です。

数値で算術演算を行い、実際に重要な場合 (ユーザーにレンダリングする場合など) にのみ基数を気にします。更新のたびに表示する必要がある場合でも、いくつかの変換を節約できます。これにより、高速であるだけでなく、はるかにシンプルでクリーンになります.

于 2013-04-10T16:23:54.903 に答える
1

単に別のベースで列挙したい場合は、明示的にインクリメントする必要はありません:

BASE = 4
MAX = 100
(0..MAX).each do |x|
   puts x.to_s( BASE )
end

これは多くのコードではなく、かなり高速です。それは要件に適していますか?

そして、あなたの根底にある問題をよりよく一致させるために(私はそれを理解していますか?)

NODES = 4
BASE = NODES + 1
MAX = BASE ** NODES
(0...MAX).each do |x|
   puts ("0" * NODES + x.to_s( BASE )).chars.to_a[(-NODES..-1)].join('.')
end

上記の時間をラップトップで 0.01 秒に設定しました。しかし、9 つのノードで試すと、はるかに長い時間がかかります (10 億回ループすることになります!)。

于 2013-04-10T16:48:27.770 に答える