我成功地解决了一个问题,我确定一个数字是否可以写成两个方格的总和。
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
我如何修复该方法
答案 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