простые множители

У меня есть простой алгоритм факторизации.

void primeFactor(int number){
    if (number == 1)return;

    int x = 2;
    while (number%x != 0)x++;

    cout << x << endl;
    primeFactor(number / x);
}

Он отлично работает для небольших чисел, но когда я когда-либо ввожу большое число, например 809800987876, я получаю -1 примерно после 3 множителей.

Итак, вот пример вывода для 809800987876.

> 2 2 486957767
> -1

Как я могу это исправить?


person JohnCena7070    schedule 02.12.2015    source источник
comment
Пожалуйста, не меняйте свой вопрос на другой вопрос. Если у вас есть новый вопрос, задайте новый вопрос, используя ссылку «Задать вопрос».   -  person NathanOliver    schedule 02.12.2015


Ответы (1)


Вы переполняете int. В типичной системе максимальное значение int равно 2147483647. 809800987876 больше, поэтому оно переполняется. Вы можете использовать long long с максимальным значением не менее 9223372036854775807.

person NathanOliver    schedule 02.12.2015
comment
Если бы только у моего банковского счета была такая же проблема - person EaziLuizi; 02.12.2015
comment
Спасибо, не могли бы вы прокомментировать мой алгоритм? может быть эффективнее? - person JohnCena7070; 02.12.2015
comment
также не было бы лучше, если бы я использовал _int64 вместо этого? - person JohnCena7070; 02.12.2015
comment
@JohnCena7070 JohnCena7070 Ну, я бы не стал рекурсивно решать эту проблему. Есть хороший ответ [здесь(stackoverflow.com/a/11924315/4342498), который показывает, как это сделать итеративно и имеет больше информации для еще лучших подходов. Что касается вашего второго вопроса, то это скорее вопрос стиля. long long гарантированно будет не менее 64 бит. - person NathanOliver; 02.12.2015
comment
@ JohnCena7070 есть как простые улучшения, которые вы можете внести в пробное деление (например, кроме 2, вам не нужно проверять какие-либо четные числа, и вам нужно только дойти до и включить sqrt ввода), и другие более быстрые (но более сложные) алгоритмы. - person harold; 02.12.2015