Troque dois números sem usar uma terceira variável: C, Python Agenda

Na programação, a troca de linguagem significa trocar o valor de duas variáveis. A variável pode conter um número, string, lista ou array, objeto, etc. A forma geral de troca é usar uma variável temporária para armazenar valores. Por exemplo,

Trocar dois Numbers

As etapas gerais para trocar dois números são:

  • Declarada uma variável temporária C
  • Atribua o valor de A a C, ou seja, C = A. Agora C = 20
  • Atribua o valor de B a A, então A = 30
  • Atribua o valor de C a B, então B = 20, pois C tem o valor 20.

É assim que a troca é feita com a ajuda de uma variável temporária. Este método funcionará tanto para números inteiros quanto para números flutuantes.

Trocar usando equação aritmética

Como sabemos, trocar significa trocar o conteúdo de dois objetos, campos ou variáveis. Trocar usando operação aritmética significa realizar a operação de troca usando a equação matemática, ou seja, adição e subtração.

Se recebermos dois números e formos solicitados a trocá-los sem usar uma variável temporária, então, usando três equações aritméticas, poderemos trocar os números.

Pseudocódigo para troca de números usando operação aritmética:

A = A + B
B = A - B
A = A - B

Vamos supor que temos dois números, A = 20 e B = 30.

Condição 1:    A = A+B

                  Então, o valor atual de A é 20+30 = 50

Condição 2:    B =AB

                   Agora, B = 50-30 = 20
                   Podemos ver que obtivemos o valor de A em B

Condição 3:    A =AB

                   Finalmente, A = 50-20 = 30
                   A tem o valor inicial de B.

Então, apenas trocamos os números.

Aqui está o programa para trocar dois números em C/C++:

#include<stdio.h>
int main()
{
	int a, b;
	printf("Enter value of A: ");
	scanf("%d", & a);
	printf("Enter value of B: ");
	scanf("%d", & b);
	printf("A = %d, B = %d", a, b);
	a = a + b;
	b = a - b;
	a = a - b;
	printf("\nNow, A = %d, B = %d", a, b);
}

Saída:

Enter value of A: 20
Enter value of B: 30
A = 20 , B = 30
Now, A = 30 , B = 20

Programa em Python:

a = int(input("Enter value of A: "))
b = int(input("Enter value of B: "))
print("A = {} and B = {}".format(a, b))
a = a + b
b = a - b
a = a - b
print("Now, A = {} and B = {}".format(a, b))

Saída:

Enter value of A: 20
Enter value of B: 30
A = 20 , B = 30
Now, A = 30 , B = 20

Agora em Python, nem precisamos executar operações aritméticas. Podemos usar:

uma,b = b,uma

Aqui está uma demonstração onde a=20, b=30;

Trocar usando equação aritmética

Trocar usando Bitwise XOR Operator

Este método também é conhecido como troca XOR. XOR significa OR exclusivo. Tomamos dois bits como entradas para o XOR nesta operação bit a bit. Para obter uma saída do XOR, apenas uma entrada deve ser 1. Caso contrário, a saída será 0. A tabela a seguir mostra a saída para todas as combinações de entrada A B.

Precisamos saber como funciona a operação XOR para trocar dois números usando a operação bit a bit. Aqui está uma tabela para XOR onde A e B são valores de entrada.

A B A X OU B
0 0 0
0 1 1
1 0 1
1 1 0

Se duas entradas tiverem o mesmo valor, a operação XOR fornecerá 0; caso contrário, 1. Neste exemplo, usaremos uma operação 3 XOR. Na maioria das linguagens de programação, XOR é denotado como “^”.

Vamos supor A=4 (em binário = 0100) e B=7 (em binário, 0111)

Condição 1:    A = A ^ B

A 0 1 0 0
B 0 1 1 1
A^B 0 0 1 1

Agora, A = 0011 (em binário).

Condição 2:    B = A^B

A 0 0 1 1
B 0 1 1 1
A^B 0 1 0 0

Então B = 0100, que foi o valor binário inicial de A.

Condição 3:    A = A^B

A 0 0 1 1
B 0 1 0 0
A^B 0 1 1 1

Finalmente, A = 0111, que era o valor binário equivalente de B.

Programa em C/C++:

#include<stdio.h>
int main()
{
	int a, b;
	printf("Enter value of A: ");
	scanf("%d", & a);
	printf("Enter value of B: ");
	scanf("%d", & b);
	printf("A = %d, B = %d", a, b);
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("\nNow, A = %d, B = %d", a, b);
}

Saída:

Enter value of A:4
Enter value of B:7
A=4, B=7
Now, A=7, B=4.

Programa em Python:

a = int(input("Enter value of A: "))
b = int(input("Enter value of B: "))
print("A = {} and B = {}".format(a, b))
a = a ^ b
b = a ^ b
a = a ^ b
print("Now, A = {} and B = {}".format(a, b))

Saída:

Enter the value of A:10
Enter the value of B:15
A=10 and B=15
Now, A=15,B=10.

Swap Numbers usando aritmética bit a bit

Este método é igual ao método aritmético, mas usaremos operações bit a bit, como AND, OR e Elogio para realizar adição e subtração. Antes de passarmos aos passos, vamos dar uma olhada rápida em “Elogio”.

O complemento de 1 significa transformar todos os 0 em 1 e 1 em 0. Vejamos um exemplo.

  • Vamos supor um número 23, um número decimal.
  • A conversão para binário dá uso a 10111. Existem apenas 5 bits, mas o computador armazena números em 8,16,32,64 .. bits. Então vamos adicionar zero na frente do binário. Isso não alterará o valor original do número. Então isso se tornará 00010111.
  • Como sabemos, o complemento de 1 significa mudar todos os 0 para 1 e 1 para 0, realizando assim o complemento de 1 0001011111101000

O complemento deste 1 é representado com “~” este símbolo na maioria das linguagens de programação. Colocar este símbolo antes de qualquer valor inteiro ou valor de ponto flutuante fornecerá o complemento de 1.

E complemento de 2 significa adicionar “1” binário ao complemento de 1. Se fizermos o complemento de 2 ao número acima:

  • Binário = 00010111
  • Elogio de 1 = 11101000
  • Elogio 2:

          11101000

          + 1

          11101001

Portanto, o complemento de 2 é 11101001. Este é o binário para -23.
Em resumo, para realizar o complemento de 2 de um número A, ficará assim:

Complemento de 2 de A = (~A) + 1

Agora vamos supor A=8 (binário 00001000), B=10(00001010)

Condição 1:    UMA = (A e B) + (A | B)

                   É equivalente a A = A + B.

                   A e B = 00001000 e 00001010 = 00001000

                   Um | B = 00001000 | 00001010 = 00001010

Agora, 00001000 + 00001010 = 00010010 (decimal 18)

Então, A = 18

Condição 2: B = A + (~B) + 1

                   É equivalente a B = AB

Aqui, B = A – B

Da discussão acima, se precisarmos realizar a subtração, realizamos o complemento de 2 ao número negativo e depois o adicionamos.

Então, -B = ~B + 1

Agora, B = 00010010 + (11110101) + 1 = 00001000

O valor de B equivale ao decimal 8, que era o valor inicial.

Condição 3: UMA = UMA + (~B) + 1

                   É equivalente a A = AB

Agora, A = 00010010 + 11110111 + 1

          A = 00001010 (equivalente ao decimal 10)

Por fim, A obteve o valor de B. Assim, a troca foi concluída.

Programa em C/C++:

#include<stdio.h>
int main()
{
	int a, b;
	printf("Enter value of A: ");
	scanf("%d", & a);
	printf("Enter value of B: ");
	scanf("%d", & b);
	printf("A = %d, B = %d", a, b);
	a = (a & b) + (a | b);
	b = a + ~b + 1;
	a = a + ~b + 1;
	printf("\nNow, A = %d, B = %d", a, b);
}

Saída:

Enter the value of A: 8
Enter the value of B:10
A=8, B=10
Now, A=10, B=8

Programa em Python:

a = int(input("Enter value of A: "))
b = int(input("Enter value of B: "))
print("A = {} and B = {}".format(a, b))
a = (a & b) + (a | b)
b = a + ~b + 1
a = a + ~b + 1
print("Now, A = {} and B = {}".format(a, b))

Saída:

Enter the value of A: 25
Enter the value of B: 25
A = 25 and B = 25
Now, A = 25 and B = 25

O que é estouro aritmético?

O termo estouro significa exceder o limite. Estouro aritmético significa que o resultado de qualquer operação aritmética excede o intervalo ou limite da representação numérica da arquitetura do computador. Por exemplo, se um número for dividido por zero, ele se tornará infinito e o sistema numérico do computador não poderá mantê-lo em 32 ou 64 bits.

Representação de número inteiro
Representação de números inteiros em um sistema de 32 bits

A consequência do estouro aritmético pode ser:

  • A adição de dois números positivos torna-se negativa. Porque o bit de sinal pode se tornar 1, significando um número negativo.
  • A adição de dois números negativos torna-se positiva. Porque o bit de sinal pode se tornar 0, significando um número positivo.