Fazer uma função DIVS que:
retorna 0 se o número num é primo e 1 caso contrário. Se o número não for primo, as variáveis max e min devem assumir os valores do menor e do maior divisores inteiros do número, respectivamente, desconsiderando o número 1 e o próprio número num.
retorna 0 se o número num é primo e 1 caso contrário. Se o número não for primo, as variáveis max e min devem assumir os valores do menor e do maior divisores inteiros do número, respectivamente, desconsiderando o número 1 e o próprio número num.
Passo 1
Beleza, vou começar resumindo o que o exercício pede e o que precisamos saber.
Enunciado em miúdos: criar uma função DIVS que receba um número inteiro
Enunciado em miúdos: criar uma função DIVS que receba um número inteiro
num
e faça o seguinte:- Se
num
for primo, retorne 0. - Se não for primo, retorne 1 e preencha duas variáveis (por referência ou ponteiro) chamadas
min
emax
com o menor e o maior divisor denum
, exceto 1 e o próprionum
.
Matéria envolvida:
- Conceito de número primo (só divisível por 1 e por ele mesmo).
- Estruturas de repetição para buscar divisores.
- Condicionais para decidir se é primo ou não.
- Noções de como passar/retornar múltiplos valores (via ponteiro ou referência).
O que vamos usar:
- Operador de resto (
%
) para testar divisibilidade. - Laços
for
para varrer possíveis divisores. - Variáveis auxiliares para guardar temporariamente o menor e o maior divisor.
Passo 2
Entendendo o teste de primalidade
Um número
Um número
num
é primo se, ao testar todos os inteiros i
desde 2 até num-1
, nenhum deles dividir num
exatamente (isto é, num % i != 0
para todo i
). Se acharmos um i
tal quesignifica que
i
é divisor de num
e, portanto, num
não é primo.Como nosso aluno ainda tá começando, a gente vai testar todos
i
de 2 até num-1
. Se não encontrar nenhum divisor nessa faixa, num
é primo.Passo 3
Pegando o menor e o maior divisor
Quando descobrimos que
Quando descobrimos que
num
não é primo, já sabemos que existe pelo menos um divisor d
tal que 2 \le d \le num-1
.- Para achar o menor divisor (
min
), basta varreri
de 2 aténum-1
e, no primeiroi
que satisfizernum % i == 0
, a gente guardamin = i
e para essa busca. - Para achar o maior divisor (
max
), podemos varrerj
denum-1
até 2 (decrescente) e, no primeiroj
que dividirnum
, guardarmax = j
.
Obs.: dá pra otimizar indo até
num/2
já que nenhum divisor (além dele próprio) é maior que num/2
, mas vamos manter simples: 2 até num-1
.Passo 4
Montando a função DIVS (pseudocódigo em C)
int DIVS(int num, int *min, int *max) {
// Primeiro, testamos se é primo
int acheiDivisor = 0; // flag para saber se encontrou divisor
for (int i = 2; i < num; i++) {
if (num % i == 0) {
acheiDivisor = 1;
break;
}
}
if (!acheiDivisor) {
// Não achou nenhum divisor ≠ 1 e ≠ num → é primo
return 0;
}
// Se chegou aqui, num NÃO é primo. Vamos achar min e max.
// Menor divisor
for (int i = 2; i < num; i++) {
if (num % i == 0) {
*min = i;
break;
}
}
// Maior divisor
for (int j = num - 1; j >= 2; j--) {
if (num % j == 0) {
*max = j;
break;
}
}
return 1;
}
Explicando rapidinho:
- A variável
acheiDivisor
serve pra saber se o número tem algum divisor além de 1 e de si mesmo. - Se
acheiDivisor
continuar 0 depois do primeirofor
, o número é primo e a gente retorna 0 direto. - Se for não primo, fazemos dois laços: um subindo para achar o primeiro divisor (menor) e um descendo para achar o último (maior), guardamos em
*min
e*max
, e retornamos 1.
Resposta
Segue a implementação final da função DIVS em C, usando LaTeX para as fórmulas nos comentários principais:
// DIVS(num, &min, &max):
// retorna 0 se num é primo, 1 caso contrário;
// para não-primos, *min = menor divisor (2 ≤ d ≤ num-1),
// *max = maior divisor (2 ≤ d ≤ num-1).
int DIVS(int num, int *min, int *max) {
int acheiDivisor = 0;
for (int i = 2; i < num; i++) {
// testando se i | num, ou seja, num % i == 0
if (num % i == 0) {
acheiDivisor = 1;
break;
}
}
if (!acheiDivisor) {
return 0; // é primo
}
// não é primo, buscar menores e maiores divisores
for (int i = 2; i < num; i++) {
if (num % i == 0) {
*min = i; // menor divisor
break;
}
}
for (int j = num - 1; j >= 2; j--) {
if (num % j == 0) {
*max = j; // maior divisor
break;
}
}
return 1;
}