Fazer uma função com as seguintes características:
retorna 1 se os números são iguais, 0 se são diferentes e -1 se a soma ou o produto estoura a faixa dos inteiros. Além disso, retorna a soma e o produto dos dois números.

Passo 1

Beleza, então o exercício quer que a gente faça uma função que receba dois inteiros (digamos a e b) e faça o seguinte:
  1. Calcule a soma e o produto .
  2. Se a soma ou o produto “estourar” a faixa de valores que um inteiro normal suporta (em C, por exemplo, de até ), a função retorna .
  3. Se não estourar, ela retorna 1 se ou 0 se .
  4. Além disso, a gente precisa devolver também esses valores de e .
Conteúdo envolvido:
  • Operações básicas (soma e multiplicação)
  • Noções de overflow em inteiros (faixa de a )
  • Estruturas condicionais (if/else)
  • Retorno múltiplo (usando ponteiros, tupla, struct etc.)

Passo 2

Primeiro a gente define as fórmulas e qual faixa vamos usar.
  • Soma: S = a + b
  • Produto: P = a times b
  • Faixa de um inteiro 32 bits com sinal: MIN = -2^31, MAX = 2^31-1

Passo 3

Como detectar overflow na soma?
  • Se e , então .
  • Se e , então .
Dessa forma a gente não soma de fato e estoura: só compara limites antes.

Passo 4

Como detectar overflow no produto?
  • Se e ou , aí estoura.
  • Se , não tem perigo de overflow (0 vezes qualquer coisa é 0).
Também evitamos fazer a multiplicação “de verdade” antes de checar.

Passo 5

Hora de juntar tudo num pseudo-código (estilo C):
struct Resultado {
  int status;   // -1, 0 ou 1
  int soma;
  int produto;
};

struct Resultado minhaFuncao(int a, int b) {
  const int MIN = -2147483648;   // -2^31
  const int MAX =  2147483647;   //  2^31 - 1
  struct Resultado R;

  // Passo A: checar overflow da soma
  if ((b > 0  && a >  MAX - b) ||
      (b < 0  && a <  MIN - b)) {
    R.status = -1;
    return R;
  }
  int S = a + b;

  // Passo B: checar overflow do produto
  if (b != 0 &&
     ((b > 0 && (a >  MAX / b || a < MIN / b)) ||
      (b < 0 && (a >  MIN / b || a < MAX / b)))) {
    R.status = -1;
    return R;
  }
  int P = a * b;

  // Passo C: definir status pelo critério de igualdade
  if (a == b)
    R.status = 1;
  else
    R.status = 0;

  // Passo D: preencher soma e produto
  R.soma = S;
  R.produto = P;
  return R;
}

Resposta

Veja acima a função minhaFuncao em estilo C, que:
  1. Checa overflow de soma e produto segundo as fórmulas de faixa.
  2. Retorna -1 em caso de estouro, ou 1 se os números são iguais, 0 se são diferentes.
  3. Devolve também a soma e o produto .

Exercícios relacionados