查找数字是否为2个幂的总和

时间:2014-10-02 22:35:08

标签: ruby arrays exponent

我成功地解决了一个问题,我确定一个数字是否可以写成两个方格的总和。

25 => [5,0], [3,4]
5**2+ 0**2 = 25 and 3**2 + 4**2 = 25

以下是我解决的问题

def power_pairs(num)
  a = (0..100).to_a
  a.combination(2).select{|x|(x[0] ** 2) + (x[1] ** 2) == num}
end

power_pairs(40)
=> [[2,6]]

我想修改此方法以确定传入的数字是否实际上是一个电源号。

电源号码可以表示为2种电力的总和。

27 = 0**2 + 3**3
28 = 1**2 + 3**3

我如何修复该方法

2 个答案:

答案 0 :(得分:1)

以下给出了将数字除以两个相等幂数之和的答案。它可以修改以解决您的问题。您只需修改powers

def powers power, num
  a = []
  i = 0
  while (k = i ** power) <= num
    a.push([i, k])
    i += 1
  end
  a
end

powers(3, 100)
# => [[0, 0], [1, 1], [2, 8], [3, 27], [4, 64]]

def power_pairs power, num
  a = powers(power, num)
  a.map{|i, k| [i, a.find{|_, l| l == num - k}.to_a.first]}
  .select(&:last)
  .map(&:sort)
  .uniq
end

power_pairs(2, 25)
# => [[0, 5], [3, 4]]

power_pairs(3, 28)
# => [[1, 3]]

答案 1 :(得分:1)

<强>假设

我假设,给定一个整数n >= 8,你想确定是否有整数a, p, b, q,所有>= 2,这样:

n = a**p + b**q

<强>代码

这是一种方法。请注意,我正在缓存值以执行乘法而不是取幂(尽管应该测试它是否实际上节省了时间,或耗尽了可用内存)。

def sum_power(n) # n >= 2
  @cache = (2..n-1).each_with_object({}) { |i,h| h[[i,2]] = i*i }
  (2..Float::INFINITY).each do |pow|
    (2..n-4).each do |m|
      x = m_to_pow(m,pow)
      if x <= n-4
        pow_other = power(n-x)
        return [[m,pow], pow_other] if pow_other
      else
        return nil if m == 2
        break
      end
    end
  end
end

def power(n) # n >= 2
  (2..Float::INFINITY).each do |pow|
    (2..n-1).each do |m|
      x = m_to_pow(m, pow)
      case x <=> n
      when 0 then return m, pow
      when 1
        return nil if m == 2
        break
      end
    end
  end
end

def m_to_pow(m,pow)
  x = @cache[[m,pow]]
  if x.nil?
    x = m * @cache[[m,pow-1]]
    @cache[[m,pow]] = x 
  end
  x
end

<强>实施例

sum_power(25)                #=> [[3, 2], [4, 2]]     => 3**2 + 4**2
sum_power(26)                #=> nil
sum_power(3468)              #=> [[7, 3], [5, 5]]     => 7**3 + 5**5 
sum_power(1426716)           #=> [[19, 3], [17, 5]]   => 19**3 + 17**5