How do you judge all numbers typed? Only the latter is being tried and displayed

1

@Edit people can not use vectors only for, while, and while: x

I made this code but in the end when and to display the numbers that I typed it is so the last number entered instead of all, what should I fix?

Question: A number is, by definition, prime if it has no divisors except 1 and itself. Prepare a C program to read multiple numbers and determine if each one of them is prime or not.

#include <stdio.h>
#include <locale.h>

int main (){
int a, b, num, q, quantidade, primo;

setlocale(LC_ALL, "Portuguese");

printf ("Quantos número deseja ser informado: ");
scanf ("%d", &quantidade);

for (q=1; q<=quantidade; q++){
    printf ("Digite um número: ");
    scanf ("%d",&num);
}

for (a=1; a<=quantidade; a++){
    primo=0;
    for(b=1; b<=quantidade; b++)
        if((a % b) == 0)
            primo++;
    if (primo == 2) printf ("%d É PRIMO.\n", num);
    else printf ("%d NÃO É PRIMO.\n", num);
}
}
    
asked by anonymous 15.10.2017 / 05:25

3 answers

1

If you can not use vectors, which would be the best solution to the problem, you can pass the cipher checking logic into the while that reads the numbers.

You can also make some adjustments to the cousin's own verification loop, which makes it simpler and more efficient:

printf ("Quantos número deseja ser informado: ");
scanf ("%d", &quantidade);

for (q=1; q<=quantidade; q++)
{
    printf ("Digite um número: ");
    scanf ("%d",&num);

    //a lógica de verificação do primo vem agora aqui, à medida que lê cada numero
    primo=0;

    //agora começa em 2 e termina em num-1, verificando menos 2 elementos sempre
    for (a=2; a<num; a++) 
    {
        if(num % a == 0){
            primo++; 
            break; //se deu para dividir por um já não precisa de ver mais
        }
    }

    //agora testa com 0 e não 2 devido ao ajuste do for
    if (primo == 0) printf ("%d É PRIMO.\n", num);
    else printf ("%d NÃO É PRIMO.\n", num);
}

See the Ideone example

Organization with functions

It would be better to organize the cousin's verification logic in a separate function:

int ePrimo(int n){
    int a;
    for (a=2; a<n; a++)
    {
        if(n % a == 0){
            return 0; //agora fica mais simples pois basta retornar
        }
    }

    return 1; //se chegou ao fim é primo
}

int main ()
{
    int num, q, quantidade;

    setlocale(LC_ALL, "Portuguese");

    printf ("Quantos número deseja ser informado: ");
    scanf ("%d", &quantidade);

    for (q=1; q<=quantidade; q++)
    {
        printf ("Digite um número: ");
        scanf ("%d",&num);

        //aqui agora apenas mostra o resultado da função ePrimo
        printf("%d %s.\n",num, ePrimo(num)? "É PRIMO": "NÃO É PRIMO");
    }

    return 0;
}

See this example also in Ideone

Efficiency checks on Primo

Just as @JeffersonQuesado indicated in the comments, he still has room to improve the part of the cousin's search with some specific changes:

  • Search only while the current number is less than or equal to the square root of the boundary, since from there we have a guarantee that there will be no divisible.
  • If the number is not even and therefore is not divisible by 2, it will not be divisible by any other pair.

Considering these improvements the verification function would look like this:

int ePrimo(int n)
{
    if (n % 2 == 0) return 0; //se for pair sai logo como não primo

    int a, limite = sqrt(n); //calcula o limite com a raiz quadrada do numero

    for (a=3; a<=limite; a+=2) //agora anda de 2 em 2 excluindo todos os pares
    {
        if(n % a == 0)
        {
            return 0; //agora fica mais simples pois basta retornar
        }
    }

    return 1; //se chegou ao fim é primo
}
    
15.10.2017 / 16:25
0

Direct response: You have to check if the number is prime before you update the num variable. ... When your first for is executed, it reads numbers and saves it in the num variable. However, when reading the value, nothing happens. When your for arrives at the end, your variable num stays with the last value entered.

    
15.10.2017 / 05:38
0

The variable "num" should be a vector, try changing after the first SCANF to:

     int num[quantidade];

And restructure the code for that.

    
15.10.2017 / 05:38