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.

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 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 e max com o menor e o maior divisor de num, exceto 1 e o próprio num.
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 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 que
num bmod i = 0
significa 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 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 varrer i de 2 até num-1 e, no primeiro i que satisfizer num % i == 0, a gente guarda min = i e para essa busca.
  • Para achar o maior divisor (max), podemos varrer j de num-1 até 2 (decrescente) e, no primeiro j que dividir num, guardar max = 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 primeiro for, 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;
}

Exercícios relacionados