2011-03-17 2 views
4

세 번째 변수를 사용하지 않고 두 개의 변수를 숫자 값으로 교체해야합니다. 간단한 해결책은 무엇입니까?세 번째 변수를 사용하지 않고 교환하는 방법은 무엇입니까?

+1

[제 3 변수를 사용하지 않고, 두 변수의 값을 바꿔]의 중복 가능성 (http://stackoverflow.com/questions/756750/swap-the XOR 함께 달성 두 번째 변수를 사용하지 않고 세 번째 변수를 사용하지 않고). 또한 [임시 변수를 사용하지 않고 두 개의 변수 교환] (http://stackoverflow.com/questions/804706/swap-two-variables-without-using-a-temp-variable) –

+0

http://stackoverflow.com/questions/804706/swap-two-variables-using-a-temp-variable – Inisheer

+0

@ 인터뷰 중 트릭 질문으로 사용하는 것을 보았습니다. * 증명할 의미가 무엇인지 모르겠지만 그것을 보았습니다. – ray

답변

16

우리는 방법 중 하나, 즉 산술 연산자를 사용하여 봅시다. 두 변수가 x = 50 및 y = 70이라고 가정하고 세 번째 변수를 사용하지 않고 x = 70 및 y = 50으로 만드는 두 변수의 값을 교환하는 방법을 살펴 보겠습니다. Y
X = X - -
• X = X + Y를 제공
주는 Y X 이것은 다음과 같은 산술 연산, 즉
X = X + Y
Y = X를 사용하여 수행 할 수 있습니다 = 70 + 50이므로 x는 120과 같습니다.
• y = x - y는 y의 값을 50으로 만듭니다.
• x = x - y는 x = 120 - 50이고 x의 값은 70이된다.

+0

x 또는 y가 다른 것과 비례하여 매우 큰 경우 어떻게 될까요? – jonsca

+2

좋은 해결책이지만 오버플로에주의해야합니다. – Fede

+4

'x - = y = (x + = y) - y;라고 대답하고 선생님에게 가장 가혹한 질문 중 하나입니다. – Amadan

1

여기에 MIPS 어셈블러에 있습니다. 첫 번째 해결책은 길고 나쁘다. 두 번째 XOR을 사용하는 것이 좋습니다.

addi $t0, $0, -5 
addi $t1, $0, 15 

add $t0, $t0, $t1 
sub $t1, $t1, $t0 
nor $t1, $0, $t1 
addi $t1, $t1, 1 
sub $t0, $t0, $t1 

#### 

xor $t0, $t0, $t1 
xor $t1, $t0, $t1 
xor $t0, $t0, $t1 
5

변수 유형에 따라 Interlocked.Exchange을 사용할 수 있습니다. 이것은 원자 연산을 사용하여 스왑을 수행합니다.

4
int x = 15; 
int y = 5; 

x = x + y; 
y = x - y; 
x = x - y; 
10

int A = ...; 
int B = ...; 
A = A^B; 
B = A^B; 
A = A^B; 
+0

@Bertrand, 방금 "마음 테스트"를했으며 여전히 괜찮다고 생각합니다. A가 B와 같으면 첫 번째 할당에서 A의 결과는 0이 될 것이고 B는 B가 0 인 XOR B가 할당 된 다음 A가 B가 다시 0 인 XOR B가 할당됩니다 (시작 A와 같음) . – Fede

+0

A = 1, B = 1. 1 단계 : A = A^B = 1^1 = 0. Step2 : B = A^B = 0^1 = 1. Step3 : A = A^B = 0^1 = 1. 그것이 나에게 효과가있는 것처럼 보입니다. –

관련 문제