#include<stdio.h>
#include<math.h> // MUDANÇA aqui

// Verifica se o número é primo
int primo (int num)
{
	int i, ultimo_div; // Mudança aqui

        ultimo_div= (int) sqrt (num); // MELHORIA 2: há um teorema que diz que, se um número possui divisores maiores que um, então
        // pelo menos um desses divisores está entre 2 e a raiz quadrada desse número. Com base nesse conhecimento, precisamos buscar
        // por um divisor apenas no intervalor [2,sqrt(num)], a fim de descobrir se o número é primo ou não.

        if (num%2 == 0) return 0; // Mudança: retorna logo que não é primo se num for divisível por 2.

	for(i=3 ; i <= ultimo_div ; i+=2)  // Melhoria: como num não é divisível por 2, então também não é divisível por
        // qualquer outro número par. Assim, podemos pular o teste de divisão com todos os números pares maiores que 2,
        // o que reduz pela metade a quantidade de teste de divisores no laço for.
	{
		if(num%i == 0)
			return 0; // Número não é primo
	}
	return 1; // Número é primo
}

// Retorna a quantidade de números primos até n
int quant_primos (int n)
{
	int i, ct=(n>=2)? 1:0;  // Mudança aqui para começar a contagem com um, para considerar o valor 2
        
	for(i=3 ; i <= n ; i+=2)  // Melhoria: pula os números pares, 
        // reduzindo  pela metade a quantidade de chamadas à função primo. 
        // Contudo, essas chamadas não demoravam muito, pois os valores pares
        // eram rapidamente identificados como não primos, quando testava-se 2 como divisor. 
	{
	    if(primo(i))
			ct++;
	}
	return ct;
}


// Ler um numero inteiro N e imprime quantos primos existem entre 2 e N
int main (int argc, char * argv[])
{
	int n;
	
        // Recebe o valor via argumento ou via scanf
	if(!argv[1])
	{
		printf("Digite um valor:");
		scanf("%d",&n);
	}
	else
		n = atoi(argv[1]);
/*
	if(primo(n) == 1)
		printf("É primo!");
	else
		printf("Não é primo!");
*/
	printf("Existem %d primos entre 2 e %d\n",quant_primos(n),n);
}

