Можете ли вы указать, в чём именно заключается ошибка?

Задача: <br/> Определите R как разность между максимальным и минимальным простыми делителями целого числа, исключая само число. <br/> Создайте программу, которая будет анализировать целые числа, превышающие 3 333 337, в порядке возрастания, и находить среди них такие, для которых R больше 1000 и кратно 3. <br/> Запишите в первом столбце первые 5 найденных чисел, а во втором — соответствующие значения R. <br/> <br/> Код: <br/> <pre><code class="cs">using static System.Math;
class MAIN
{
    public class Simple_Dividers
    {
        List&lt;int&gt; simple_dividers = new List&lt;int&gt;(new int[] {2, 3}); //Список простых чисел

        public List&lt;int&gt; ShowSimpleDividers
        {
            get
            {
                return simple_dividers;
            }
        }

        public bool IsSimple(int n) //Проверка числа на простоту; добавление его и всех простых чисел меньше него в simple_dividers
        {
            if (n &lt; simple_dividers[simple_dividers.Count - 1] &amp;&amp; simple_dividers.Contains(n)) return true;

            foreach (int div in simple_dividers) if (n % div == 0) return false;

            for (int poss_div = simple_dividers[simple_dividers.Count - 1] + 2; poss_div &lt; n; poss_div += 2) if (this.IsSimple(poss_div)) if (n % poss_div == 0) return false;

            simple_dividers.Add(n);
            return true;
        }

        public int GetR(int input) //Собственно, основной метод (решение). Возвращает R, если число подходит, и -1, если число не подходит
        {
            double square = Sqrt(input);

            int min_div = -1;
            int max_div = -1;

            foreach (int div in simple_dividers) //Поиск наименьшего...
  • 4 марта 2025 г. 12:44
Ответы на вопрос 2
В вашем коде присутствует несколько ошибок и недоработок, которые могут повлиять на правильность выполнения задачи. Основные проблемы, которые нужно исправить или учесть:

1. **Проверка на простоту**: Метод `IsSimple` не полностью корректен. Вы используете `simple_dividers.Contains(n)`, но это будет возвращать true только если n одно из первых двух простых чисел (т.е. 2 или 3). Проверка простоты должна быть более универсальной и включать в себя все простые числа.

2. **Получение делителей**: В методе `GetR` вам нужно находить минимальные и максимальные делители, но текущая логика этого не делает. Вы правильно итерируетесь по списку `simple_dividers`, однако требуется окончательное логическое вычисление для определения минимального и максимального делителей.

3. **Условия для R**: Вам нужно гарантировать, что вы корректно подбираете числа, у которых R больше 1000 и кратно 3.

4. **Отсутствие завершения метода `GetR`**: Пояснение к методу `GetR` обрывается, не реализовав конструкцию, возвращающую значение R.

5. **Структура программы**: Если вы хотите продолжать выполнение программы до нахождения 5 чисел, вам понадобится дополнительно реализовать циклы, которые будут считывать числа и проверять условия.

Пример исправлений кода:

```csharp
using System;
using System.Collections.Generic;

class Program
{
    public class SimpleDividers
    {
        private List<int> simpleDividers = new List<int> { 2, 3 }; // Начнем со списка первых двух простых чисел

        public bool IsSimple(int n)
        {
            if (n < 2) return false; // Учитываем, что ноль и один не являются простыми числами.
            for (int i = 2; i * i <= n; i++)
            {
                if (n % i == 0) return false; // Если делится на i, значит не простое
            }
            simpleDividers.Add(n); // Если дошли сюда, значит n - простое.
            return true;
        }

        public int GetR(int input)
        {
            int minDiv = -1;
            int maxDiv = -1;

            foreach (int div in simpleDividers)
            {
                if (input % div == 0)
                {
                    if (minDiv == -1)
                        minDiv = div; // Найден минимальный делитель
                    maxDiv = div; // Каждый раз обновляем максимальный делитель
                }
            }

            if (minDiv == -1 || maxDiv == -1) return -1; // Нет делителей

            return maxDiv - minDiv; // Разность между максимальным и минимальным простыми делителями
        }
    }

    static void Main(string[] args)
    {
        SimpleDividers sd = new SimpleDividers();

        int count = 0;
        for (int num = 3333338; count < 5; num++)
        {
            if (sd.IsSimple(num))
            {
                int R = sd.GetR(num);
                if (R > 1000 && R % 3 == 0)
                {
                    Console.WriteLine($"Число: {num}, R: {R}");
                    count++;
                }
            }
        }
    }
}
```

Обратите внимание, что в этом коде:
- Исправлены методы для проверки простоты числа и вычисления R.
- Добавлен цикл проверки чисел, который будет проверять условия и выводить результаты до нахождения первых пяти чисел.
Я просто не обратил внимания на "большие" и начал перебор с 3333337,  а в остальном моя программа работает верно... Что ж, удалить вопрос так и так уже нельзя, так что оставлю это здесь. Проблема решена.
Похожие вопросы