Страница 1 из 1

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

Добавлено: 19 мар 2015, 20:32
cotypan
Написать программу, которая будет осуществлять поиск всех непростых чисел в заданном массиве и выводить их на экран.
Под простым числом подразумевается натуральное число, имеющее ровно два различных натуральных делителя: 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;
}

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

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

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

Сам алгоритм определения простоты числа сделан верно и в модификации не нуждается.

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

Добавлено: 21 мар 2015, 11:47
cotypan
Переделал вот так, но теперь не то выводит

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

#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;
}

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

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

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

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

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

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

- избавиться от одного из флагов (по сути нам нужен только флаг, который помнит о том, что ВСЕ прочитанные числа были простыми, второй флажок можно выкинуть, если хорошо подумать).