数字基数和Ruby - 增加针对特定数字库的变量的最快方法是什么?

时间:2013-04-10 16:15:22

标签: ruby numbers

我希望能够有一个变量“num”,我可以增加它,并让它被理解为它的基数。

例如,如果num为base 7且等于66,如果我执行num + = 1,则num应设置为100.

一个解决方案涉及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是具有四个节点的图形,其中第一节点具有到第四节点的边缘,第二节点具有到第三节点的边缘,第三节点具有到第一节点的边缘,并且第四节点没有到第一节点的边缘有任何转变。

因此,如果我想生成所有四个节点图,其中每个节点只有一个出口边,我需要从0.0.0.0到4.4.4.4。

2 个答案:

答案 0 :(得分:2)

基础与算术无关。数字只是数字,所有基数只是表示它们的略有不同的方式。例如,66 7 (x y 表示x以y为基数写入)是48 10 并且无论您在添加时的想法是什么一到它,结果始终是相同的数字:100 7 = 49 10 = 31 16 = ...等等其他基地(即使是非常奇怪的基地,如黄金比率基数)。具有相同结果的操作相同。

只需对数字进行算术运算,并且只在实际重要时(例如为用户渲染时)担心基数。即使您需要在每次更新后显示它,您仍然可以节省一些转换,这不仅更快,而且更简单,更清晰。

答案 1 :(得分: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亿次!)