Найти непростые числа в массиве и вывести их

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
cotypan
Сообщения: 5
Зарегистрирован: 19 мар 2015, 14:24

Написать программу, которая будет осуществлять поиск всех непростых чисел в заданном массиве и выводить их на экран.
Под простым числом подразумевается натуральное число, имеющее ровно два различных натуральных делителя: 1 и само себя.
Формат входных данных
Формат результата
Для каждого массива из входных данных выведите по одному в строке те элементы массива, которые НЕ ЯВЛЯЮТСЯ простыми числами. Если в маасиве все элементы простые числа, выведите -1.

Мои нароботки не работают((

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int i, d, n,f;
    int T=0,m=0;
    scanf("%d",&T);
    while(m <T ){
    int Na;
    scanf("%d", &Na);
    int a[Na];
    int j;
   for(j=0;j<Na;j++){
    scanf("%d",&a[j]);}
for (i=0; i<=Na; i++)
{
    n=a[i];
    f=0;
    if(n==1)
        f=0;
    for (d=2; d*d<=n; d++)
        if(n%d==0)
        {
            f=1;
                break;
        }
    if(!f)
     printf("-1");  
    else printf("%d",a[i]);
}
m++;
}
return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

-1 мы должны выводить только если ВСЕ элементы массива являются простыми числами. Отсюда следует, что инициализировать флажок f следует до внешнего цикла, а проверять после внешнего цикла.

Для того, чтобы хранить информацию о том, простым является ТЕКУЩИЙ элемент массива или нет, очевидно, нужен будет другой флажок. Он должен вести себя во всём так, как сейчас ведёт себя f, за исключением того, что по его значению не должно писаться -1. То есть либо пишем число (если оно не простое), либо ничего не пишем (else отсутствует).

Сам алгоритм определения простоты числа сделан верно и в модификации не нуждается.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
cotypan
Сообщения: 5
Зарегистрирован: 19 мар 2015, 14:24

Переделал вот так, но теперь не то выводит

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int main()
{
   int i, d, n,f,y;
   int T=0,m=0;
   scanf("%d",&T);

   while(m <T ){
      int Na;
      scanf("%d", &Na);
      int a[Na];
      int j;
      for(j=0;j<Na;j++){
         scanf("%d",&a[j]);
      }
      f=0;
      y=0;
      for (i=0; i<=Na; i++)
      {
         n=a[i];
         if(n==1)
            f=0; y=1;
         for (d=2; d*d<=n; d++)
            if(n%d==0)
            {
               f=1; y=0;
               break;
            }
      }

      for (i=0; i<=Na; i++){
         if(!f)
            printf(" -1");
         else if (!y)
            printf(" %d\n", a[i]);
      }

      m++;
   }

   return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Во-певых, меня очень смущает вот это условие в цикле: В С++ массивы имеют индексы от 0 до N-1.
Причём, когда ты читаешь элементы массива, у тебя условие правильное, а когда второй раз пишешь цикл по массиву, то неправильное.

Далее обрати внимание, что если мы идентифицировали, что цисло не простое, то мы его должны написать сразу же (то есть внутри цикла), за пределами цикла мы должны написать только в том случае, если ни ВСЕ числа оказались простыми, и текст в этом случае будет "-1".

Ну, и раз уж мне будет позволено заговорить об оптимизациях, то я скажу, что тут много чего можно упростить, как-то:

- оставить одну переменную-счётчик (сейчас их две)

- избавиться от массива (достаточно обычной переменной и одного цикла, а не двух, в котором мы будем читать значение в переменную и тут же его анализировать на простоту)

- избавиться от одного из флагов (по сути нам нужен только флаг, который помнит о том, что ВСЕ прочитанные числа были простыми, второй флажок можно выкинуть, если хорошо подумать).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить