O que você precisa saber antes de resolver questões sobre números inteiros
A primeira coisa que as pessoas ignoram é a definição do tipo. Inteiro não é apenas "número sem casa decimal". É um tipo com limites, com comportamento definido por padrão e com armadilhas específicas que surgem nas operações mais óbvias. Resolver questões sobre números inteiros exige entender isso antes de começar a testar código. Vamos começar pelo contrário, explicando a operação que causa mais erro do que qualquer outra. Quando você faz divisão inteira em Python usando //, o resultado não é truncado em direção a zero. Ele é arredondado para baixo, na direção do negativo infinito. Isso significa que -7 // 2 resulta em -4, não -3. A maioria dos materiais didáticos ensina divisão como simples corte da parte fracionária, mas essa é uma simplificação que quebra assim que os números negativos aparecem. Se você precisa de comportamento de truncamento tradicional, use int(a / b) em vez de a // b.
questões sobre números inteiros: onde os iniciantes erram
O problema mais frequente em questões de concursos e entrevistas envolve ordem de precedência e a diferença entre / e //. Considere esta expressão: a = 17
b = 5
print(a // b * b + a % b)
O resultado esperado por quem não prestou atenção é que a divisão e o resto se cancelem de forma qualquer. O resultado real, considerando a precedência correta em Python, é exatamente 17. Isso ocorre porque // e % têm a mesma precedência e são avaliados da esquerda para a direita. A propriedade fundamental aqui é que a == (a // b) * b + (a % b) sempre se mantém, inclusive com números negativos, porque o sinal do resto segue o divisor, não o dividendo. Esse detalhe específica — o sinal do operador módulo — é o que mais causa erro em questões de múltipla escolha. Outro ponto que ninguém enfatiza: o tamanho do tipo inteiro varia conforme a linguagem e a plataforma. Em Python, inteiros têm precisão arbitrária. Em C e C++, int de 32 bits vai de -2.147.483.648 a 2.147.483.647. Em C#, int é sempre 32 bits. Em Java, short é 16 bits, long é 64 bits. Isso importa porque questões sobre números inteiros frequentemente pedem cálculos com valores grandes, e usar o tipo errado gera overflow silencioso em linguagens com tipos fixos. Em Python, esse problema não existe, mas em Java ou C++ você precisa decidir entre int, long, ou até BigInteger para evitar que um cálculo simplesmente embaralhe o resultado.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Aqui vai um exemplo prático que encontrei recentemente. Estava resolvendo uma questão onde precisava verificar se um número era divisível por 3 usando soma dos dígitos. A questão pedia para processar entradas de até 10^18. Em C++, eu tinha declarado a variável como int e o programa retornava valores incorretos para entradas maiores que 2 bilhões. Mudei para long long e o problema sumiu. Não foi um bug complexo — foi só ignorar a faixa do tipo antes de começar a codificar. Sempre verifique a faixa antes de escolher o tipo. Existe também um comportamento que muitos não esperam ao trabalhar com deslocamento de bits. Em Python, -1 >> 1 resulta em -1, não em 0. Isso acontece porque Python usa representação em complemento de dois com sinal estendido. Deslocamentos à direita de números negativos preservam o bit de sinal. Se a questão pedir para extrair bits específicos de um valor negativo, contar com comportamento de deslocamento ingênuo leva ao resultado errado.
Para operações matemáticas puras, como calcular MDC (máximo divisor comum) ou mmc (mínimo múltiplo comum), o algoritmo de Euclides é o padrão. Em Python, a função math.gcd() já resolve isso de forma otimizada. Para mmc, a relação é simples: mmc(a, b) = abs(a * b) // gcd(a, b). O erro comum aqui é esquecer o abs() ou usar / no lugar de //, o que gera um float em vez de um inteiro. Em questões competitivas, isso pode parecer trivial, mas custa pontos. Uma limitação importante que vale a pena mencionar: mesmo em Python, operações com inteiros muito grandes não são gratuitas. Multiplicar dois números de milhões de dígitos pode levar segundos, enquanto em C com types fixos o mesmo cálculo leva nanissegundos. Se a questão exige processar milhares de operações com números enormes, considere usar bibliotecas especializadas ou mudar de linguagem. Inteiros de precisão arbitrária têm custo de memória e processamento que não aparecem em exercícios pequenos, mas ficam evidentes em escalas maiores.
Por fim, sobre a questão do zero. Divisão por zero lanza exceção em praticamente todas as linguagens. Mas 0 0 em Python retorna 1, enquanto em algumas outras linguagens é indefinido. 0 // n é sempre 0 para qualquer n diferente de zero. n % 0 lança exceção. Esses comportamentos fronteira aparecem em questões justamente porque testam se a pessoa conhece os detalhes ou apenas a regra geral.