Pergunta: Dado um inteiro x com sinal de 32 bits, retorne o resultado da inversão dos dígitos em x.
Retorna 0 se o inteiro invertido exceder o intervalo [−2^31, 2^31 − 1] de um inteiro com sinal de 32 bits.
Suponha que o ambiente não permita o armazenamento de números inteiros de 64 bits (com ou sem sinal).
A chave para esta questão é que o intervalo de números inteiros é limitado e o estouro deve ser evitado.
Código 1:
int reverse(int x){
long n = 0;
while(x!=0){
n = n*10 + x%10;
x /= 10;
}
return (int)n == n? n:0;
}
Ao retornar o valor, após converter n do tipo long para o tipo int, se for igual ao número original, significa que não ocorreu estouro; se não for igual, significa estouro, devendo ser retornado 0.
Código 2:
int reverse(int x){
int i=0, output=0, x_len=0, flag=1;
if(x==-2147483648) return 0;
if(x<0){
x = (-1)*x;
flag = -1;
}
x_len = ceil(log10((long int)x+1));
for(i=0;i<x_len;i++){
output += (x%10)*pow(10,x_len-i-1);
x /= 10;
}
if(output < 0) return 0;
return flag*output;
}
Esse código é mais problemático de lidar e o custo de tempo e espaço é maior, portanto não é tão bom quanto o código 1.