Ajuda com exercicio de estrutura de dados

2 respostas
S

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).

2 Respostas

wldomiciano

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

S

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

Criado 13 de outubro de 2020
Ultima resposta 14 de out. de 2020
Respostas 2
Participantes 2