我有一组要检查的数字。如果数字是偶数,程序将检查它的最大奇数分频器是否相等。例如,如果数字是12,程序将返回一个像[3,3,3,3]或36的数组,它将是[9,9,9,9],让我们说54, [27,27]和56,[7,7,7,7,7,7,7,7]等。我正在用ruby编写代码。我无法弄清楚如何编写正确的算法。任何帮助将不胜感激。
答案 0 :(得分:5)
试试这个
def fun(num)
odd = num
odd /= 2 while odd.even?
[odd] * (num / odd)
end
这是如何运作的?
这将num
除以2,直到它为奇数。
答案 1 :(得分:0)
您可以分两步完成此操作:
确定数字可被2整除的次数(假设in
为正) - 在伪代码中:
int divisors(int in):
int divisor = 1
for(; in % 2 == 0; divisor *= 2)
in /= 2 //integer division!!!
return divisor
divisors
将返回2的最大幂,in
可被整除。这个想法是任何数字n
都可以用它的素数因子来表示,类似于:
n = 2^a * 3^b * 5^c * ...
我们只需要知道a
,因为分解的其余部分必然是我们最大的奇数除数。或者更详细一点:
n = 2^a * 3^b * 5^c * ...
largest_odd_divisor = 3^b * 5^c * ...
largest_even_divisor = 2^a = divisors(n)
我们找不到任何更大的奇数除数,因为我们只从n
中消除了所有偶数除数,所以我们只得到了除largest_odd_divisor
之外的除数,但由于这个除数会变得均匀。
其余的都是微不足道的:
获取a
(如上所示),创建一个大小为2^a
的数组,并用n / (2^a)
填充。