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.
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:- Calcule a soma
e o produto . - 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 . - Se não estourar, ela retorna
1
seou 0
se. - 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:
- Produto:
- Faixa de um inteiro 32 bits com sinal:
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:- Checa overflow de soma e produto segundo as fórmulas de faixa.
- Retorna
-1
em caso de estouro, ou1
se os números são iguais,0
se são diferentes. - Devolve também a soma
e o produto .