Ajuda com exercicio de estrutura de dados

Ola bom dia

Estou fazendo faculdade de sistemas de informação, porem com a pandemia estou tendo aulas online, e estou com problema de internet, o que esta dificultando a fazer as atividades, tem um execercico que foi solicitado, porem estou perdido e não sei por onde começar, e vi alguns videos e pesquisei, porem não cheguei em lugar algum, gostaria de um help

Na Matemática, define-se como número primo um
número natural, maior que 1, e que não possua nenhum outro divisor fora 1 e
ele mesmo. O conceito de número primo é muito útil na área de criptografia.
Uma parte da sequência (infinita) de números primos é dada por:
2; 3; 5; 7; 11; 13; 17; 19; 23; 29;

Existem vários algoritmos para calcular uma sequência de números primos. O
algoritmo mais simples envolve iterar por uma sequência de números naturais,
e testar o resto da divisão de um dado número pelos números inferiores,
começando a partir de 2. Se o resto da divisão for nula em alguns desses casos,
o número não é primo. Caso contrário, o número é primo. Um algoritmo
muito melhor para o cálculo da sequência de números primos é chamado
de Crivo de Eratóstenes. Pesquise sobre como esse algoritmo funciona e
escreva um programa em C que implementa o algoritmo simples e o Crivo
de Eratóstenes, em duas funções separadas. O programa deve solicitar ao
usuário que entre com um número inteiro maior que 2, que vai ser o valor
máximo a ser testado e mostrar a sequência de todos os números primos
inferiores a esse valor, calculada pelos dois algoritmos (funções).

Vc deve começar pedindo ao usuário para inserir um número maior que 2. Vc pode fazer isso simples assim:

#include <stdio.h>

int main() {
  int limite = 0;

  printf("Entre com um número maior que 2: ");

  scanf("%d", &limite);

  if (limite <= 2)
    puts("Número inválido!");
  else
    puts("Número válido");

  return 0;
}

O problema do código acima é que se o usuário entrar com algum dado diferente do que for solicitado, o programa simplesmente termina.

Seria legal se vc pudesse fazer algo como não permitir que o programa continue enquanto o usuario não entrar com o tipo de dado correto. Para isso vc precisaria de uma solução mais robusta, tipo essa:

#include <stdio.h>

int pegarNumero() {
  int numero = 0;
  const int MAX = 20;
  char line[MAX];

  do {
    printf("Entre com um número inteiro maior que 2: ");
    fgets(line, MAX, stdin);
    sscanf(line, "%d", &numero);
  } while (numero <= 2);

  return numero;
}

int main() {
  int limite = pegarNumero();

  return 0;
}

De resto, o enunciado pede pra vc criar 2 funções, uma implementando o algoritmo Crivo de Eratostenes e a outra implementando o algoritmo mais simples.

Com isso e pesquisando mais um pouco, vi que é possível implementar o Crivo de Eratostenes da seguinte forma:

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

int pegarNumero() {
  int numero = 0;
  const int MAX = 20;
  char line[MAX];

  do {
    printf("Entre com um número inteiro maior que 2: ");
    fgets(line, MAX, stdin);
    sscanf(line, "%d", &numero);
  } while (numero <= 2);

  return numero;
}

void usandoCrivoDeEratostenes(const int limite) {
  bool numeros[limite + 1];

  memset(numeros, true, sizeof(numeros));

  for (int i = 2; i * i <= limite; i++)
    if (numeros[i])
      for (int j = i * i; j <= limite; j += i)
        numeros[j] = false;

  for (int i = 2; i <= limite; i++)
    if (numeros[i])
      printf("%d\n", i);
}

int main() {
  int limite = pegarNumero();

  puts("=== CRIVO DE ERATÓSTENES ===");
  usandoCrivoDeEratostenes(limite);

  return 0;
}

Como eu não pude testar muito, não sei se está funcionando 100%, deixo esta tarefa pra vc, eu mostrei o código mais pra te dar um ponto pra começar mesmo.

Estas foram as fontes que usei:

Criei um repl.it com o código completo: https://repl.it/@wldomiciano/GUJSieveOfEratosthenes

Serio muito obrigado, agora consigo um ponto de começo, vou tentar reproduzir de outra forma, com base nas suas explicações
Deus abençoe você querido

1 curtida