Algorithm in C - Primes

Asked

Viewed 1,768 times

2

The program has to do a check of prime numbers, where the user type a number and the program finds the largest prime number before it. the problem with my program is that it doesn’t check until the end, for example, if I write 10 should find 7 but it finds 5 always 5.

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

/*.
  .
  .
  7)receber um numero inteiro e falar o maior numero primo que seja o anterior a este*/

int main()
{
    int opc;/*1-switch*/
    int numA=0, numB=0, numC=0, soma, aux=0; /*variaveis para calculos*/
    int i, j;/*contadores*/
    int vet[10];/*vetores inteiros*/
    float media;/*variaveis para calculos*/

    printf("escolha qual exercicio quer executar:\n7)Ex7\n");
    scanf("%i", &opc);

    fflush(stdin);
    system("cls");

    switch(opc)
    {
        /*.
          .
          .
          */
    case 7:

        printf("digite um numero:\t");
        scanf("%i", &numA);

        /*inicio da fase de processamento*/

        numB=1; /*para dar inicio ao calculo de achar numero primos por tentativas*/
        numC=0;
        j=0;/*reset do contador*/
        int cont=0, y, aux2=0;

        if(numA==0 || numA==1 || numA==2)
        {
            printf("%i nao tem numero primo, anterior a ele.", numA);
            break;
        }else
        {
            for(i=0; i<numA; i++)
            {
                aux=cont/2;
                for(y=0; y<aux; y++)
                {
                    numC=cont%numB;/*faz divisao modular da variavel de entrada com     numB=1*/

                    fflush(stdin);

                    if(numC==0)/*verifica se resultado deu 0*/
                        j=j+1;/*se sim armazena em j um marcador +1/+1*/

                    numB=numB+1;/*e soma 1 ao numB para acompanhar o valor de aux*/
                }

                fflush(stdin);

                if(j==1)
                {
                    aux2=cont;
                }

                cont=cont+1;
                j=0;/*reset do contador*/

                printf("\n\n\n[%d]\n\n\n", aux2);/*verificação de variavel*/                
                printf("\n\n\n%d\n\n\n", cont);
            }

            printf("%d eh o maior numero primo antes de %i", aux2, numA);
        }

        /*fim da fase de processamento*/

        break;

    default:
        break;
    }

    return 0;
}

SOLUTION FOUND

/*inicio da fase de processamento*/

    for(i=0; i<numA; i++)
    {
        aux=numA-1;/*subtraio 1 ao numero original*/

        if(comPrimos(aux)==true)/*mando para uma função o valor armazenado na aux para verificar se é primo*/
        {/*se for verdadeiro faça*/
            printf("%d eh o maior numero primo antes de %i", aux, aux2);
            break;/*quebrar para sair do for*/
        }

        numA=aux;
    }

    /*fim da fase de processamento*/

FUNCTION

int comPrimos(int prim)
{
    int i, aux, B, j=0;

    aux=prim/2;

    int A=1;

    for(i=0; i<aux; i++)
    {/*verificação por tentativas de divisão modular*/
        B=prim%A;

        if(B==0)
            j=j+1;

        A=A+1;
    }

    fflush(stdin);
    system("cls");

    if(j==1)
        return true;

    else
        return false;

}
  • 3

    Allow me a hint: start by writing a function that checks if a number is prime. Then call this function with the value typed minus one. If the function returns true found the result if not subtract 1 and call the function again. Do this until the function returns true

  • thanks saw @ramaral

2 answers

2


Since it seems to be a didactic problem I will just leave a suggestion, I do not know if it can be valid here on Stak. If the code is not set later.

I would begin to think differently, imagine that the user enters with a very high nmr,the system goes from 0 until getting close to that number, why instead of starting from 0 the loop you do not get from the number the user entered, ai vc decrementa i to each interaction, And once you find the first prime number you come out of the loop, saving processing and dispensing with temporal variables, the function for would be more like this

    for(i=numA-1; i>0; --i)
          if(isPrimo(i)){
                printf(" primo anterior %d", i);
                break;
          }
  • I haven’t tried yet I’m in class

  • true, it is easier to catch the first number of back front that is cousin

  • so I made here look like your I will post under the cogido that I posted will be written solution to split @Abraham

1

Well there goes an example of solution to your problem. It is based on generating a vector containing 1 for the numbers that are primes and 0 for the numbers that are not, it is the famous Eratosthenes sieve. That is, sieve[19] will return 1, because 19 is prime and sieve[25] will return zero, because 25 is not prime.

The sieve is made starting as if all numbers were primes, so you take all multiples of 2, then all multiples of 3, after 5 and so on until only the primes are left. After mounting the sieve the rest of the program is very easy to do.

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

#define tamanho_crivo 10000

int main()
{
    int num, i, j, resp=0;

    // Monta o vetor para determinar se um número é primo ou não
    char crivo[tamanho_crivo];
    memset(crivo, 1, tamanho_crivo);
    crivo[0] = 0;
    crivo[1] = 0;
    for(i=2; i < tamanho_crivo; i++){
        if(crivo[i] == 1)
            for(j=2*i; j < tamanho_crivo; j = j+i)
                crivo[j] = 0;  // Números que não são primos, pois são divisíveis por i 
    }

    printf("Digite um numero inteiro positivo:\n");
    scanf("%i", &num);

    for(i=num; i > 1; i--)
        if(crivo[i]){
            resp = i;
            break;
        }

    // Imprime os resultados
    if(resp==0)
        printf("Nao tem numero primo anterior\n");
    else
        printf("%d e o maior numero primo antes de %d\n", resp, num);

    return 0;
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.