1

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

例如,如果 num 以 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。

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 回答