Куда я иду с этой функцией, чтобы найти число Spheni c? - PullRequest
0 голосов
/ 31 января 2020
bool isSphenic (int num){
    int initial_num = num;
    int product = 1;
    int prime_count = 0;
    int i = 2;

    while (num > 1){
        if(num % i == 0){
            if(isPrime(i)){
                num = num/i;
                product = product * i;
                prime_count = prime_count + 1;
            }
        }
        i++;
    }

    if(product == initial_num && prime_count == 3 ){
        return true;
    }
    return false;
}

Я не могу понять, откуда исходит отставание. Я использую его в списке из 100 чисел от 1 до 100. Он правильно идентифицирует числа spheni c, но это занимает минуты или вылетает ...

1 Ответ

2 голосов
/ 31 января 2020

Проблема с функцией заключается в том, что она не делит заданное число на простое число, пока число не делится на простое число.

Например, для числа, равного 4, деление происходит только один раз на 2, а затем I увеличивается, но число не равно 1. После деления оно равно 2.

Таким образом, функция имеет бесконечное значение l oop.

Функция может выглядеть аналогично функции, представленной в демонстрационной программе.

#include <iostream>

bool isSphenic ( unsigned int n )
{
    const unsigned int DISTINCT_PRIMES = 3;
    unsigned int count = 0;
    unsigned int product = 1;


    for ( unsigned int tmp = n, i = 2; count < DISTINCT_PRIMES && tmp != 1; i++ )
    {
        if ( tmp % i == 0 )
        {
            ++count;
            product *= i;
            while ( tmp % i == 0 ) tmp /= i;
        }
    }

    return count == DISTINCT_PRIMES && product == n; 
}

int main() 
{
    const int N = 200;

    for ( int i = 1; i < N; i++ )
    {
        if ( isSphenic( i ) ) std::cout << i << ' ';
    }
    std::cout << '\n';

    return 0;
}

Вывод программы:

30 42 66 70 78 102 105 110 114 130 138 154 165 170 174 182 186 190 195

Обратите внимание, что нет необходимости вызывать функцию sPrime как вы делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...