Notas de pincel de Likou: 29. Divida dois números (método de multiplicação, código fácil de entender, não usa nenhuma operação de multiplicação e divisão)

tópico:

29, divida dois números

Dados dois inteiros, dividendo e divisor. Divida dois números sem usar operadores de multiplicação, divisão e mod.

Retorna o quociente obtido dividindo o dividendo pelo divisor.

O resultado da divisão inteira deve ser truncado (truncar) a parte decimal, por exemplo: truncar (8,345) = 8 e truncar (-2,7335) = -2

Exemplo 1:

Entrada: dividendo = 10, divisor = 3
Saída: 3
Explicação: 10/3 = truncar (3.33333…) = truncar (3) = 3

Exemplo 2:

Entrada: dividendo = 7, divisor = -3
Resultado: -2
Explicação: 7 / -3 = truncar (-2,33333…) = -2

incitar:

Tanto o dividendo quanto o divisor são inteiros com sinal de 32 bits.
O divisor não é zero.
Assumindo que nosso ambiente só pode armazenar inteiros com sinal de 32 bits, o intervalo de valores é [−231, 231 - 1]. Nesta questão, se o resultado da divisão estourar, 231 - 1 será retornado.

Ideias para solução de problemas:

A ideia mais simples é tornar os dois números positivos, então o dividendo é continuamente subtraído pelo número até que seja menor que o divisor e, finalmente, o sinal de mais ou menos é adicionado. Você pode usar XOR para determinar se o positivo e o negativo de dois números são iguais, e a única possibilidade de estouro é que o resultado seja igual a 2 ^ 31. Obviamente, esse método atingirá o tempo limite no caso de uso (-2147483648, -1). . .

Sem ideias de tempo limite:

Obviamente, o tempo limite ocorre porque a aproximação dos dois números é muito lenta. Como a divisão não pode ser usada, a subtração deve ser usada apenas para alterar o dividendo, que é muito lento.

Portanto, considere alterar o divisor, você pode continuar a somar, o que é equivalente a multiplicar por 2, e você pode rapidamente aproximar o dividendo.

Por exemplo (100, 2), 2 é adicionado continuamente até 64 e menos de 100, então 100 deve ser subtraído de 64 para obter a aproximação mais rápida e subtrair 64 é equivalente a subtrair 32 2s.

Mas como a divisão não pode ser usada, 32 não é obviamente obtido, portanto, uma variável deve ser inicialmente 1, que é adicionada à medida que o divisor é adicionado para representar o número equivalente de divisores.

Depois de subtrair 64 de 100, o dividendo e o divisor tornam-se (36, 2) e, em seguida, o processo pode ser repetido.

Além disso, há obviamente muitos cálculos repetidos posteriormente, então você pode salvar os valores 4, 8, 16, 32, 64 e os divisores equivalentes no processo e, em seguida, percorrer na ordem inversa.

Código python para solução de problemas:

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        m, n, flag = abs(dividend), abs(divisor), int(dividend^divisor >=0)
        d, w = [], 1
        while n <= m:
            d.append((n, w))
            n += n
            w += w
        res = 0
        for n, w in d[::-1]:
            if m >= n:
                m -= n
                res += w
        return min([-res, res][flag], 2147483647)

Insira a descrição da imagem aqui

Autor: huozhixue
link: https://leetcode-cn.com/problems/divide-two-integers/solution/python3-jian-ji-by-huozhixue-xgo6/
Fonte: botão de permanência (LeetCode) HTTPS: // leetcode- cn.com/problems/divide-two-integers/

Acho que você gosta

Origin blog.csdn.net/weixin_44414948/article/details/113797624
Recomendado
Clasificación