Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2022, 18:45   #1
ruivit
Пользователь
 
Регистрация: 14.09.2022
Сообщений: 24
По умолчанию Не получается найти простые сложные числа.

В общим есть задача решая которую я вошёл в тупик. "Найдите все простые числа, меньшие 𝑁. В первой строке входного файла содержатся два целых числа: 𝑁 — диапазон, в котором
нужно найти все простые числа и 𝑄 — количество запросов в файле (10 6 𝑁 6 20 000 000,
1 6 𝑄 6 200 000). В каждой из следующих 𝑄 строк содержится по одному целому числу 𝑋, для которого
нужно вывести, простое оно или нет (0 6 𝑋 < &#119873. Должно получится как я понимаю что то вот такое.
Screenshot_3.png

Вот написал программку
Код:
#include <iostream>
#include <math.h>
using namespace std;
bool sultan(int n) 
{
    if (n == 1)
        return false; 
    for (int i = 2; i <= sqrt(n); i++) 
    {
        if (n % i == 0)
            return false;
    }
    return true;
}
int main()
{
     int Q, N, X;
     cin >> N >> Q;

     for(int i =0; i < N; i++){
     	X++;
     	if((sultan(i)) && (Q > i) && (0 < i))
		 {
		 	cout << i << "prime" << endl; 	
		 } 
		 else if((sultan(i) == false) && (Q > i) || (0 == i)){
		 	cout << i << "not" << endl;	
		 }	
	 }
    
    return 0;
}
Она выдаёт следующий результат Screenshot_1.png. Но почему то мою программу банят... Ну мол решение не верное. Я вот понять не могу в чём не верное ведь результат то дает же. Согласно примеру
ruivit вне форума Ответить с цитированием
Старый 14.09.2022, 18:50   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

А в примере еще пробелы между числом и определением not/prime

Код:
if((sultan(i)) && (Q > i) && (0 < i))
		 {
		 	cout << i << "prime" << endl; 	
		 } 
		 else if((sultan(i) == false) && (Q > i) || (0 == i)){
		 	cout << i << "not" << endl;	
		 }
А вы уверены, что стоит дважды вызывать функцию, которая занимает большую часть времени решения?

ADD: Чему изначально равно X?

Значения i для линейного цикла можно предсказать, поэтому не нужно дополнительных бесполезных проверок в цикле.

Т.е. можно отдельно обработать вне цикла ситуацию i == 0 и не проверять это в цикле от i = 1 до (i < N).

Какой смысл в проверке Q > i, когда можно сразу вычислить E = min(N, Q);

Последний раз редактировалось macomics; 14.09.2022 в 19:07.
macomics вне форума Ответить с цитированием
Старый 14.09.2022, 21:35   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Вам нужно не счетчик цикла i проверять на простоту, а число X из файла. Поэтому и цикл нужно крутить не до N, а до Q. А каким точно образом нужно использовать N, сложно понять, так как в вашем описании задачи диапазоны плохо прописаны.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.09.2022, 09:08   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Нравится мне постановка задачи: "найти простые сложные числа" . Это как "найти православных мусульман"?
А кстати - что это за "сложные числа" - это со сложной судьбой что ли? В моё студенческое время были простые и составные (но не одновременно!) . Наука, видимо, не стоит на месте...

Последний раз редактировалось digitalis; 15.09.2022 в 09:13.
digitalis вне форума Ответить с цитированием
Старый 15.09.2022, 15:54   #5
ruivit
Пользователь
 
Регистрация: 14.09.2022
Сообщений: 24
По умолчанию

Цитата:
Поэтому и цикл нужно крутить не до N
N это диапазон, я как понял диапазон тут от числа 0 до N. Q это число запросов в рамках диапазона от 0 до N По этому я цикл кручу от 0 до N. Но количество простых и сложных чисел не больше Q. Понимаю что глупость, но условие задачи такое. Но а то что нужно не I проверять на простоту, а X. Спасибо за то что указали на ошибку. Я не сразу сообразил причём X. получалось что он не в чём не участвовал раньше. )))
ruivit вне форума Ответить с цитированием
Старый 15.09.2022, 16:34   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

У вас вполне ясное задание. Вы должны в диапазоне 2 .. N найти все простые числа. В условии N ограничен от 10 до 20000000, но конкретно вам это ограничение задается в первом числе файла. Q - количество последующих подстрок, в которых записаны X.

По сути задачи вам надо прости по диапазону от 2 до N (заданному) и вычислить все простые числа в этом диапазоне. После этого пройтись по файлу и считывая X (всего их Q штук) определить является ли значение простым.

Т.е. 2 .. N - диапазон поиска простых чисел и значения X, заданные в файле, лежат в этом диапазоне.
Но само значение N задается в диапазоне от 10 до 20000000.
1 .. Q - количество строк в файле без первой т.к. в ней заданы числа N и Q. Но само значение Q задается в диапазоне 1 .. 200000.

По алгоритму. На первом этапе вы считываете N и Q. Запускаете цикл поиска простых чисел в диапазоне от 2 до N (он будет длиться по времени дольше всего) и сохраняете все простые числа в массив. После цикла поиска простых чисел вы считываете еще Q строк из файла и проверяете присутствие значения X в массиве простых чисел. Если X присутствует в массиве простых чисел, тогда выводите в выходной файл (<< X << ' prime'), иначе выводите (<< X << ' not').

Вместо массива простых чисел возможно использовать битовую карту. Это сэкономит память и ускорит второй этап проверки значений считываемых из файла.

Последний раз редактировалось macomics; 15.09.2022 в 16:39.
macomics вне форума Ответить с цитированием
Старый 15.09.2022, 16:57   #7
ruivit
Пользователь
 
Регистрация: 14.09.2022
Сообщений: 24
По умолчанию

Цитата:
У вас вполне ясное задание. Вы должны в диапазоне 2 .. N найти все простые числа. В условии N ограничен от 10 до 20000000, но конкретно вам это ограничение задается в первом числе файла. Q - количество последующих подстрок, в которых записаны X.

По сути задачи вам надо прости по диапазону от 2 до N (заданному) и вычислить все простые числа в этом диапазоне. После этого пройтись по файлу и считывая X (всего их Q штук) определить является ли значение простым.

Т.е. 2 .. N - диапазон поиска простых чисел и значения X, заданные в файле, лежат в этом диапазоне.
Но само значение N задается в диапазоне от 10 до 20000000.
1 .. Q - количество строк в файле без первой т.к. в ней заданы числа N и Q. Но само значение Q задается в диапазоне 1 .. 200000.

По алгоритму. На первом этапе вы считываете N и Q. Запускаете цикл поиска простых чисел в диапазоне от 2 до N (он будет длиться по времени дольше всего) и сохраняете все простые числа в массив. После цикла поиска простых чисел вы считываете еще Q строк из файла и проверяете присутствие значения X в массиве простых чисел. Если X присутствует в массиве простых чисел, тогда выводите в выходной файл (<< X << ' prime'), иначе выводите (<< X << ' not').
То есть как я понял N - это диапазоне числе в котором мы ищем простые числа x, ну Q это строки. то есть в каждой Q строке должно быть какое то количество X простых чисел.
ruivit вне форума Ответить с цитированием
Старый 15.09.2022, 17:02   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Нет. Вам задается Q чисел
INPUT:
Код:
N Q
X
X
X
X
.
.
X
Каждое X надо проверить на простоту, но т.к. это повторяющаяся задача, тогда чтобы не выполнять кучу одинаковых манипуляций с числами, стоит создать массив из простых чисел. Длина массива не известна, но известен диапазон поиска простых чисел - это 2 .. N. Сколько вы в этом диапазоне найдете чисел не известно. Но это существенно сократит время работы программы.

Если делать "влоб", тогда вам придется проверять 200`000 раз одни и те же числа на простоту проходя по циклу 1 .. Q

ADD: Представьте себе такой входной файл
Код:
20000000 200000
19999999
.
.
19999999
т.е. у вас в строках задается одно и тоже число 200`000 раз, а это число еще и максимально возможное. Значит это будет самый длинный из возможных циклов по Q, а еще и самый долгий поиск для ответа на вопрос о простоте этого же числа (если делать "влоб"). Я не использовал число 20`000`000 т.к. четные числа легко отсеиваются - они все составные, кроме 2 т.к. делятся на 2.

Последний раз редактировалось macomics; 15.09.2022 в 17:08.
macomics вне форума Ответить с цитированием
Старый 15.09.2022, 17:11   #9
ruivit
Пользователь
 
Регистрация: 14.09.2022
Сообщений: 24
По умолчанию

Понял сейчас попробую решить так задачу.
ruivit вне форума Ответить с цитированием
Старый 15.09.2022, 17:21   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Можно кстати еще немного схитрить. Искать простые числа не в диапазоне 2 .. N, а в диапазоне 2 .. max(X).
Т.е. вводите первое X и ищите все простые числа в диапазоне 2 .. X. Считываете следующий X и если он меньше или равен предыдущему, тогда у вас уже есть массив, для ответа на вопрос о его простоте, иначе вам надо продолжить поиск простых чисел в диапазоне Xпредыдущее .. Xсчитанное. Но это и значит, что поиск простых чисел будет производиться только в диапазоне от 2 до max(X).
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
простые или сложные числа ALUKARD_HELLSING Общие вопросы Delphi 10 31.10.2014 14:12
найти все простые делители числа н keyshia_nicole Visual C++ 0 31.01.2014 18:39
В массиве А(100) найти простые числа. olegk95 Помощь студентам 2 10.12.2013 09:56
Найти все простые числа С++ vsubotka Помощь студентам 3 20.11.2013 12:05
Задачи в ТурбоПаскаль: найти числа Армстронга и просуммировать числа в последовательности номера которых простые числа Lena1808 Помощь студентам 1 17.05.2012 08:00