Kohila G Ответов: 5

Нужна помощь в хранении значений в массиве


Я пытаюсь вывести все простые числа из заданного диапазона. Итак, я планирую поместить все простые числа в массив, а затем использовать его для отображения.
Вот моя попытка сделать это.

Что я уже пробовал:

#include<stdio.h>
#define size 100
int main()
{
        int n,i,j,m=0,a[size],p,count;
        printf("Enter a number upto which u want to pick out prime numbers: ");
        scanf("%d",&n);
        m = 0;
        for(i=1;i<=n;i++){
                for(j=1;j<=i;j++){
                        if(i%j == 0){
                                count++;
                                if (count == 2){
                                        a[m++] = i;
                                        p = m;
                                        }
                        }
                }
        }
        for(m=0;m<p;m++)
                printf("%d\n",a[m]);
}


Но в результате я получаю так много мусорных ценностей. Как вы думаете, где моя логика пошла не так?

5 Ответов

Рейтинг:
2

Daniel Pfeffer

Есть несколько проблем с вашим кодом:

1. Ограничить количество простых чисел до 100 (#определите размер 100), но вы никогда не проверяете, переполнен ли Ваш массив. Когда это произойдет, все виды непредсказуемых (и неприятных!) вещей произойдут.
2. Вы используете крайне неэффективный способ тестирования простых чисел.
2a. [подумайте] в N % M, что такое самый большой M, который должен быть проверен, чтобы убедиться, что N является простым?
2b. [подумайте] как вы можете использовать уже собранную информацию, чтобы помочь вычислить больше простых чисел?


Рейтинг:
12

Kohila G

#include<stdio.h>
#define size 100
int main()
{
        int n,i,j,m=0,l,a[size],p,count;
        printf("Enter a number upto which u want to pick out prime numbers: ");
        scanf("%d",&n);
        m = 0;
        for(i=1;i<=n;i++){
                count = 0;
                for(j=1;j<=i;j++){
                        if(i%j == 0)
                count++;}
                if (count == 2){
                a[m++] =i;
                p = m;
                }
                }
        for(l=0;l<p;l++)
                printf("%d\n",a[l]);
}
~               


@OriginalGriff я попробовал свое решение. Я допустил ошибки внутри цикла и сделал так, чтобы счетчик инициализировался до 0 каждый раз, когда запускается первый цикл.


Рейтинг:
1

OriginalGriff

Что ж... вы храните только какие-либо значения в a если количество равно 2. Так что это случится один раз, и только один.

Я бы посоветовал вам написать код для заполнения a со всеми числами от 1 до n (что является простым for цикл), а затем написать код для удаления кратных из этого (так что вы удаляете 2 * 2 == 4, 2 * 3 == 6,... а потом 3 * 2 == 6, 3 * 3 == 9, ...)
Самый простой способ удалить их-сделать их отрицательными: любое отрицательное число не является простым, поэтому вам не нужно удалять его кратные.

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


Рейтинг:
0

CPallini

Ваш тест на примитивность не совсем корректен для меня.
В любом случае я бы поместил его в отдельную функцию, чтобы сделать код более аккуратным. например

#include <stdio.h>

#define SIZE 100

int is_prime(int n);

int main()
{
  int limit;
  int prime[SIZE];
  int n;
  int count = 0;

  do
  {
     printf("Enter a number upto which u want to pick out prime numbers: \n");
  } while( scanf("%d", &limit ) < 1);


  for (n=2; n<limit && count < SIZE; ++n)
  {
    if ( is_prime(n) )
    {
      prime[count] = n;
      ++count;
    }
  }

  for (n=0; n<count; ++n)
    printf("%d\n", prime[n]);

  return 0;
}

int is_prime(int n)
{
  int i;
  for (i=2; i<=n/2; ++i)
    if ( (n % i) == 0 )
      return 0;

  return 1;
}


Рейтинг:
0

Patrice T

Как уже говорилось в предыдущих решениях, логика неверна, вы также используете неинициализированные переменные (count).
Совет: отдельные вещи, если вы создадите функцию 'isprime', то это упростит основной код. Еще одним преимуществом является то, что он также упрощает тестирование кода.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.

Модульное тестирование также является хорошей идеей.
Модульное тестирование - Википедия[^]