Test prime numbers in C

6

I'm trying to develop in C a program in which the user places a sequence of numbers and it must determine whether the numbers are prime or not.

Here is my code:

#include <stdio.h>

int main() {


    int num1, num2, i;
    char op;

    do {

      printf("\nInforme um numero: ");
      scanf("%i", &num1);

      printf("\nInforme um numero: ");
      scanf("%i", &num2);

        for (i=num1; i<=num2; i++) {

            if (i % 1 == 0 && i % i == 0) {

                printf("\n%i - Primos!", i);

            } else {

                printf("\n%i - Nao primos!", i);

            }
        }

     printf("\nDeseja calcular outra sequencia de numeros? ");
     scanf("%s", &op);

    } while (op == 's' || op == 'S');

    return(0);
}

Where am I going wrong? I put a sequence from 1 to 10 and in the result all are prime.

    
asked by anonymous 03.09.2015 / 01:25

2 answers

5

The problem is that this code is not testing if the numbers are prime. The expression i % i == 0 gives a good indication that something is missing there. This expression will always be true, after all the rest of a number divided by it is always zero. And the expression i % 1 == 0 is always true. Every number divided by 1 has 0 rest. So it's unnecessary.

The main change I made was to create an internal loop that tries to make all possible divisions between 2 and the previous number that is trying to test. If a single division has zero remainder, it does not have to keep comparing. If it stops at the same number being tested it means that no division gave rest 0, so it's prime.

#include <stdio.h>

int main() {
    int num1, num2, i, j;
    char op;
    do {
        printf("\nInforme um numero: ");
        scanf("%i", &num1);
        printf("\nInforme um numero: ");
        scanf("%i", &num2);
        for (i = num1; i <= num2; i++) {
            for (j = 2; j < i; j++) {
                if (i % j == 0) {
                    break;
                }
            }
            if (i == j) {
                printf("\n%i - Primo!", i);
            } else {
                printf("\n%i - Nao primo!", i);
            }
        }
        printf("\nDeseja calcular outra sequencia de numeros? ");
        scanf("%s", &op);
    } while (op == 's' || op == 'S');
    return(0);
}

See running on ideone .

You can optimize this, but as you are learning, that's fine, better not complicate.

    
03.09.2015 / 01:41
2

Recently I had done an exercise of this (except that in addition to talking if it is cousin or did not have to show the sum of the odd and even pairs), I also do ADS rs, well, I edited in mine to serve you, I think which was simpler to understand and looked like this:

#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
main(void) // void, para não precisar do return 0;
{
    setlocale(LC_ALL,""); // permite colocar acentos
    int num1, num2, num, cont, isPrimo;
    char op;
    do
    {
        isPrimo = 0; // é um bool binário, onde 0 não é primo e um é primo
        printf("Número Inicial: ");
        scanf("%i", &num1);
        printf("Número Final: ");
        scanf("%i", &num2);

        for(num = num1; num < num2; num ++)
        { //vai do num1 ao num2 e armazena o valor atual da sequência em num
            for(cont = 1; cont < num; cont ++)
                if(num % cont == 0) /*compara se num é divisivel pela sequencia de 1 até ele mesmo
                                      e atribui isso ao bool, para verificarmos depois*/
                    isPrimo += 1; /* aumenta o valor, se ele for primo será 1, pois número primo é 
                                    divísel por um e por ele mesmo, porém comecei o cont com 1, então se o 
                                    número for primo ele entrará no if apenas uma vez, deixando isPrimo = 1, formando um bool*/
            if(isPrimo == 1) // comparo se o bool é verdadeiro (1) e imprimo que é primo
                printf("%3i é primo.\n", num);
            else // se nao ele não é primo
                printf("%3i não é primo.\n", num);
            isPrimo = 0; //redefino o bool
        }
        printf("\nDeseja calcular outra sequencia de numeros? ");
        scanf("%s", &op);
        system("cls");
    }while(op == 's' || op == 'S');
    system("pause");

}

I hope it has become simpler to understand rsr, nor would answer the question because it has been here for a long time and already has an answer, but are different logics and maybe you understand this better.

    
19.09.2015 / 19:06