Цель этого метода - найти ближайшее простое число, меньшее переданного значения. Любое значение меньше 3 является неопределенным поведением, поэтому я просто возвращаю -1. Проблема заключается в том, что когда я передаю значения 5, 20, 100 и 1, это результат:

Passed in 5 Expected 3: 5
Passed in 20 Expected 19: 19
Passed in 100 Expected 97: 97
Passed in 1 Expected -1: -1

Вот способ:

int Hash::nearestPrime(int num){
        if(num <= 3){
                return -1;
        }
        for(int i = 2; i < num; i++){
                if(num == 3){
                        return 3;
                }
                if(num % i == 0 && num != i){
                        num--;
                        i = 2;
                }
        }
        return num;
}
c++
0
macman926 25 Ноя 2019 в 08:57
Можете ли вы рассказать нам о логике внутреннего оператора if? Нам было бы очень полезно разобраться в вашем коде. Спасибо
 – 
Saurav Rai
25 Ноя 2019 в 09:01
Кажется, ваша проблема в том, что вы возвращаете ближайшее простое число меньше или равно переданному числу. Просто вычтите единицу из num в начале, чтобы получить ближайшее простое число меньше переданного числа.
 – 
walnut
25 Ноя 2019 в 09:05
Исправьте первый if на num<3, это неоднозначно.
 – 
Abhinav Kinagi
25 Ноя 2019 в 09:11
С другой стороны, 2 - самое нечетное простое число из существующих. Ваш чек на <= 3 неверен.
 – 
Tanveer Badar
25 Ноя 2019 в 09:14

2 ответа

Вы можете зацикливаться и уменьшать до тех пор, пока не будет найдено следующее, если функция определит, является ли значение простым.

#include <iostream>

int prime (int n)
{
  int i;
  for (i = 2; i < n; i++)
    if (n % i == 0) return 0;
  return 1;
}

int run (unsigned int n)
{
  while (!prime (--n));
  return n;
}

int main ()
{
  std::cout << run (3);
  return 0;
}
0
Raymond 25 Ноя 2019 в 09:04

Ваш метод правильный, но с простой ошибкой.

Назначьте i = 1 вместо i = 2 внутри условия if. Потому что если вы назначите 2, то для i++ следующее значение проверки будет начинаться с 3 . Но вам нужно проверить это с 2 .

int Hash::nearestPrime(int num){
        if(num <= 3){
                return -1;
        }
        for(int i = 2; i < num; i++){
                if(num == 3){
                        return 3;
                }
                if(num % i == 0 && num != i){
                        num--;
                        // mistake in this line
                        i = 1;
                }
        }
        return num;
}
0
Faruk Hossain 25 Ноя 2019 в 09:10
Этого не требуется. Если число имеет простой множитель 2 с кратностью 2 или больше, OP улавливает это, проверяя регистр i=4. Если число имеет простой множитель 2 с кратностью 1, то либо оно равно 2 (который исключает OP), либо у него есть другой простой множитель, не равный 2, который OP тоже ловит.
 – 
walnut
25 Ноя 2019 в 09:52