Лучший способ найти все факторы данного числа - PullRequest
30 голосов
/ 27 октября 2008

Все числа, которые делятся поровну на x.

Я положил в 4, он возвращает: 4, 2, 1

редактировать: я знаю, это звучит домашнее задание. Я пишу небольшое приложение, чтобы заполнить некоторые таблицы продуктов полу случайными тестовыми данными. Двумя свойствами являются ItemMaximum и Item Multiplier. Мне нужно убедиться, что множитель не создаст нелогичной ситуации, когда покупка еще 1 предмета поставит ордер выше максимально допустимого. Таким образом, факторы предоставят список допустимых значений для моих тестовых данных.

редактировать ++: Это то, с чем я пошел после помощи всех. Еще раз спасибо!

edit #: я написал 3 разные версии, чтобы увидеть, какая мне понравилась больше, и проверил их по факторингу малых и очень больших чисел. Я вставлю результаты.

static IEnumerable<int> GetFactors2(int n)
{
    return from a in Enumerable.Range(1, n)
                  where n % a == 0
                  select a;                      
}

private IEnumerable<int> GetFactors3(int x)
{            
    for (int factor = 1; factor * factor <= x; factor++)
    {
        if (x % factor == 0)
        {
            yield return factor;
            if (factor * factor != x)
                yield return x / factor;
        }
    }
}

private IEnumerable<int> GetFactors1(int x)
{
    int max = (int)Math.Ceiling(Math.Sqrt(x));
    for (int factor = 1; factor < max; factor++)
    {
        if(x % factor == 0)
        {
            yield return factor;
            if(factor != max)
                yield return x / factor;
        }
    }
}

В тиках. При факторинге число 20, каждое 5 раз:

  • GetFactors1-5,445,881
  • GetFactors2-4,308,234
  • GetFactors3-2,913,659

При разложении числа 20000 по 5 раз:

  • GetFactors1-5,644,457
  • GetFactors2-12,117,938
  • GetFactors3-3,108,182

Ответы [ 12 ]

0 голосов
/ 07 марта 2019

Программа для получения простых множителей целых чисел в коде JavaScript.

function getFactors(num1){
    var factors = [];
    var divider = 2;
    while(num1 != 1){
        if(num1 % divider == 0){
            num1 = num1 / divider;
            factors.push(divider);
        }
        else{
            divider++;
        }
    }
    console.log(factors);
    return factors;
}

getFactors(20);
0 голосов
/ 27 октября 2008

Linq решение:

IEnumerable<int> GetFactors(int n)
{
  Debug.Assert(n >= 1);
  return from i in Enumerable.Range(1, n)
         where n % i == 0
         select i;
}
...