2017-11-30 16 views
1

+, -, *,/및 % 연산자를 사용하지 않고 숫자가 4의 배수인지 확인하십시오.XOR (Python)을 사용하여 4의 배수

def multipleFour(n): 
    if n == 1: 
    return False 
    XOR = 0 
    for i in range(n): 
     XOR = XOR^1 
    return XOR == n 
multipleFour(20) 

내 대답은

+2

당신이 * 필요하십니까를 * xor를 사용하거나 다른 비트 연산자를 사용할 수 있습니까? 일반적으로 마스크 (bitwise-and,'&')와 논리 부정 ('not')으로 테스트합니다. 'return n & 0x3 == 0'은 당신을 덮을 것이고, xor는 필요 없다. (C 연산자 우선 순위에서 괄호를 추가 할 필요가있다.'return! (n & 0x3);')하지만 파이썬은 비트와 부울 연산자의 우선 순위가 자연스럽게 바뀌므로 아무런 괄호도 필요 없습니다.) – ShadowRanger

+0

'(x^3) - x == 3'이지만 뺄셈은 안됩니다 ... 흠 .. – Amadan

답변

3

을 당신은 . 당신의 루프에 대한 전 = 1 I = n은에 실행해야합니다 즉

def multipleFour(n): 
    if n == 1: 
    return False 
    XOR = 0 
    for i in range(1, n+1): 
     XOR = XOR^i 
    return XOR == n 
multipleFour(20) 

- 루프에 대한 뿐만 아니라 에서 잘못된 XOR 문이 같아야합니다 d = 0 내지 i = n-1이 아니다.

범위의 난에 대한 의견에서 지적

으로, (1, N + 1) +를 사용하지 않는 조건을 만족하지만, 약간의 수정으로하지 않습니다 그리고 그것은 xor = xor^i

편집이 있어야합니다 ; 0

def multipleFour(n): 
     if n == 1: 
     return False 
     XOR = n 
     for i in range(1, n): 
      XOR = XOR^i 
     return XOR == n 
    multipleFour(20) 
+0

그건 내가 알지 못했던 꽤 독창적 인 알고리즘입니다. (그리고 실제 코드에서 사용하는 것은 우스울 것입니다). 그러나 ... 'i + 1'은 바람 피는 것처럼 보입니다 : P Still +1은 저에게 새로운 것을 가르치고 문자적인 질문에 답하는 것은 우리 중 어느 것보다 낫습니다. :) – Amadan

+1

이것은'range'의 끝을 계산하기 위해'+'를 사용하기 때문에 규칙에 위배됩니다. 그러나'XOR'을'0' 대신에'n'으로 초기화 한 다음'range (1, n)'을 통해 루프를 실행함으로써 문제를 해결할 수 있습니다. – ShadowRanger

+0

또는'reduce' (Python에서 functools.reduce)를 사용할 수있는 기회가 적고 한 줄짜리가 재미 있기 때문에'XOR' 계산을'reduce (operator.xor, range (1, n), n)'을 반환 한 후 전체 함수를'def multipleFour (n) :'n == 1과 n == reduce (operator.xor, range (1, n), n) . :-D – ShadowRanger

2

당신은 바이너리를 확인하고 0n까지 모든 정수를 XOR 연산 피할 수 False를 반환 : 4의 배수의

0 0000 
1 0001 
2 0010 
3 0011 
4 0100 8 1000 12 1100 

진 서명 '00'

입니다
def x_of_4(n): 
    return bin(n)[-2:] == '00' 

하울 r은 문자열로 변환해도 쉽게 시각화하고 이해할 수 있지만 가장 좋은 아이디어는 아니며이 방법은 n = 0에 대해 실패합니다. 동일한 작업을 수행 할 수
더 좋은 방법은이다 비트 앤과 코멘트에 @ShadowRanger에 이진 표현의 마지막 두 제로 (크레딧을 테스트 3 :

def x_of_4(n): 
    return not n & 3 
+1

문자열로 변환하는 것은 일종의 말도 안되는 방식으로, '0'에 실패하고, 비트와 함께 '0x3'은 직접적으로 하위 비트를 테스트 (형식 변환 없음)하고 '0'에 대해 올바르게 작동합니다. – ShadowRanger

+1

재미 있지만, 결과를 비워 두는 것만으로도 효과를 볼 수 있습니다 :'bin (n) [- 2 :]를 돌려 보내지 마세요. rstrip ('b0')' – ShadowRanger

+0

hehe, Thank you. 나는 더 나은 방법이 있다는 것을 알고 있었고, 그것이 근본적으로 어떻게 작용 하는지를 명확하게 설명하기 때문에 거기에 넣고 싶었습니다. 많은 합병증이있었습니다. 나는 당신이 당신의 코멘트를 올렸을 때 적절한 bitwise op를 찾고 있었다. 나는 당신의 제안을 반영하기 위해 답을 수정했다. –

3

귀하의 XOR 시작하고, 당신이 이제까지 그것을 사용하는 유일한 작업은 XOR^1이다 -,이 일이 등을 해결할 수있다 결과는 0 또는 1 일 수 있습니다. 귀하의 코드는 1에 명시 적으로 False을 반환하며 더 큰 숫자에는 True을 반환 할 수 없습니다. 0에 대해서만 True을 반환해야합니다.

한편, 뭔가가 4의 배수 여부를 확인하는 것은 매우 간단합니다 - ANDNOT 사용 "+, 사용하지 않고, *,/및 % 연산자."

def multipleFour(n): 
    return not(n & 3)