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
numfor primo, retorne 0. - Se não for primo, retorne 1 e preencha duas variáveis (por referência ou ponteiro) chamadas
minemaxcom 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
forpara 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 varreride 2 aténum-1e, no primeiroique satisfizernum % i == 0, a gente guardamin = ie para essa busca. - Para achar o maior divisor (
max), podemos varrerjdenum-1até 2 (decrescente) e, no primeirojque 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
acheiDivisorserve pra saber se o número tem algum divisor além de 1 e de si mesmo. - Se
acheiDivisorcontinuar 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
*mine*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;
}