如何编写用于除偶数最大相等奇数的代码

时间:2017-01-28 23:54:05

标签: ruby algorithm math numbers

我有一组要检查的数字。如果数字是偶数,程序将检查它的最大奇数分频器是否相等。例如,如果数字是12,程序将返回一个像[3,3,3,3]或36的数组,它将是[9,9,9,9],让我们说54, [27,27]和56,[7,7,7,7,7,7,7,7]等。我正在用ruby编写代码。我无法弄清楚如何编写正确的算法。任何帮助将不胜感激。

2 个答案:

答案 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)填充。