Задать вопрос
@OrdUs

Вероятно, никто мне не ответит, но в чём ошибка?

Задача:
Пусть R — разность максимального и минимального простых делителей целого числа, не считая самого числа.
Напишите программу, которая перебирает целые числа, большие 3 333 337 в порядке возрастания и ищет среди них такие, для которых R больше 1000 и кратно 3.
Запишите первые 5 чисел в порядке возрастания в первом столбце, во втором — соответствующие значения R.

Код:
using static System.Math;
class MAIN
{
    public class Simple_Dividers
    {
        List<int> simple_dividers = new List<int>(new int[] {2, 3}); //Список простых чисел

        public List<int> ShowSimpleDividers
        {
            get
            {
                return simple_dividers;
            }
        }


        public bool IsSimple(int n) //Проверка числа на простоту; добавление его и всех простых чисел меньше его в simple_dividers
        {
            if (n < simple_dividers[simple_dividers.Count - 1] && 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 < 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) //Поиск наименьшего простого делителя в списке
            {
                if (input % div == 0)
                {
                    min_div = div;
                    break;
                }
            }
            if (min_div == -1) //Поиск наименьшего простого делителя вне списка
            {
                for (int poss_div = simple_dividers[simple_dividers.Count - 1] + 2; poss_div < square; poss_div += 2) if (this.IsSimple(poss_div)) if (input % poss_div == 0) { min_div = poss_div; break; }
            }
            if (min_div == -1) return -1;

            int min_max_div = min_div + 1002; //Значение, меньше которого не может быть максимальный простой делитель
            for (int i = simple_dividers.IndexOf(min_div) + 1; i < simple_dividers.Count; i++) //Проверка, есть ли максимальный простой делитель в списке простых делителей
            {
                if (simple_dividers[i] >= min_max_div)
                {
                    if (((simple_dividers[i] - min_div) % 3 == 0) && (input % simple_dividers[i] == 0)) max_div = simple_dividers[i];
                }
            }
            if (max_div == -1) { for (int poss_max_div = min_div + 1002; poss_max_div < input; poss_max_div += 3) if (input % poss_max_div == 0) if (this.IsSimple(poss_max_div)) max_div = poss_max_div; } //Грубый поиск на случай, если максимального простого делителя нет в списке
            else //Для гарантии, что нет простых делителей больше
            {
                for (int poss_max_div = max_div + 3; poss_max_div < input; poss_max_div += 3) if (input % poss_max_div == 0) if (this.IsSimple(poss_max_div)) max_div = poss_max_div;
            }



            return max_div == -1 ? -1 : max_div - min_div;
        }
    }



    static void Main()
    {
        Simple_Dividers tester = new Simple_Dividers();

        int R;
        for (int i = 3_333_337, count = 0; count < 5; i++)
        {
            R = tester.GetR(i);
            if (R != -1)
            {
                Console.WriteLine($"{i} {R}");
                count++;
            }
        }
    }
}


Вместо нужного
  • 3333338 9309
  • 33333340 166665
  • 3333342 555555
  • 3333349 2748
  • 3333354 1287

программа выводит
  • 3333337 15354
  • 3333338 9309
  • 3333340 166665
  • 3333342 555555
  • 3333349 2748


Что тут не так? В чём ошибка?
  • Вопрос задан
  • 48 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@OrdUs Автор вопроса
Я просто не обратил внимания на "большие" и начал перебор с 3333337, а в остальном моя программа работает верно... Что ж, удалить вопрос так и так уже нельзя, так что оставлю это здесь. Проблема решена.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы