Тест C ++ prime l oop выполняется неверно - PullRequest
0 голосов
/ 04 мая 2020

В настоящее время я берусь за некоторые проблемы и ищу что-то, что можно проверить, чтобы проверить свои новые способности в C ++, и я решил заниматься в основном математикой, в данном случае проблемами Эйлера. Ниже приведен код для нахождения наибольшего простого множителя для данного числа, однако по какой-то причине он не go в for l oop, я даже запустил cout << "Test" << endl;, но он не будет печатать утверждение, почему это ?

#include <iostream>
#include <string>

using namespace std;

int ReturnPFactors(int number)
{
    int Factor{};
    int thisnum = number;
    for (int x = 0; x < thisnum; x++)
    {
        cout << "Here" << endl;
    }
    return Factor;
}

bool isPrime(int n)
{
    // Corner case 
    if (n <= 1)
        return false;

    // Check from 2 to n-1 
    for (int i = 2; i < n; i++)
        if (n % i == 0)
            return false;

    return true;
}

int main()
{
    //should be looking for 6857
    int Number = 600851475143;
    cout << ReturnPFactors(Number) << endl;
    return 0;
}

если у вас есть какие-либо вопросы, я буду в течение следующих приблизительно 30 минут (из этого сообщения), прежде чем я усну.

1 Ответ

3 голосов
/ 04 мая 2020

600851475143 слишком велико для типа int в типичной среде, которая имеет длину 32 бита и может хранить до 2147483647.

600851475143 в двоичном виде - 1000 1011 1110 0101 1000 1001 1110 1010 1100 0111.

В типичной среде он усекается до 32-битной длины: 1110 0101 1000 1001 1110 1010 1100 0111

Старший бит этого 1, поэтому он считается отрицательным числом в типичной среде.

Поэтому i < thisnum становится ложным и тело l oop не будет выполнено.

Вы должны использовать long long длиной не менее 64 бит и 600851475143LL с префиксом LL, обозначающим long long.

...