검 지 offer-하나의 Add 함 수 를 실현 하여 두 수 를 더 하면+,-,*,/,+,--등 네 개의 연산 자 를 사용 할 수 없습니다.

2189 단어 데이터 구조
분석:이것 은 또 하나의 고찰 이 사 고 를 발산 하 는 매우 재 미 있 는 제목 이다.우리 가 흔히 볼 수 있 는 것 이 제한 되 어 사용 되 고 있 을 때,어떻게 상식 을 깨 고 생각 하 느 냐 가 바로 이 문 제 를 해결 하 는 관건 이다.이 문 제 를 보면 먼저 우 리 는 사람들 이 어떻게 10 진법 의 덧셈 을 하 는 지 분석 할 수 있다.예 를 들 어 5+17=22 라 는 결 과 를 어떻게 얻 었 는 지 분석 할 수 있다.실제로 우 리 는 세 단계 로 나 눌 수 있 습 니 다.첫 번 째 단 계 는 여러분 에 게 만 들 어 갈 수 있 습 니 다.이때 추 가 된 결 과 는 12(한 자릿수 5 와 7 을 더 하면 들 어가 지 않 는 것 은 2,10 자릿수 0 과 1 을 더 하면 결 과 는 1)입 니 다.두 번 째 단 계 는 진 위 를 하고 5+7 에 진 이 있 으 며 진 위 는 10 입 니 다.세 번 째 단 계 는 앞의 두 결 과 를 합치 면 12+10 의 결 과 는 22 이 고 마침 5+17=22 이다.숫자 에 대해 연산 을 하 는 것 은 사 칙 연산 을 제외 하고 비트 연산 만 남 았 다.비트 연산 은 이 진 을 겨냥 한 것 이 므 로 우 리 는 이 진 으로 앞의 3 단계 걷 기 전략 이 이 진 에 도 효과 가 있 는 지 다시 한번 분석 해 보 자.5 의 이 진 은 101,17 의 이 진 10001 이다.아니면 계산 을 세 단계 로 나 누 어 보 세 요.첫 번 째 단 계 는 여러분 이 더 하지만 진 위 를 따 지지 않 고 얻 은 결 과 는 10100(마지막 두 수 는 모두 1 이 고 더 한 결 과 는 2 진법 의 10 입 니 다.이 단 계 는 진 위 를 따 지지 않 기 때문에 결 과 는 여전히 0 이다).두 번 째 단 계 는 진 위 를 기록한다.이 예 에서 마지막 자 리 를 더 할 때 만 하나의 진 을 만 들 고 결 과 는 2 진법 의 10 이다.세 번 째 단 계 는 앞의 두 단계 의 결 과 를 더 해 얻 은 결 과 는 10110 으로 마침 22 였 다.이 를 통 해 알 수 있 듯 이 3 단계 전략 은 2 진법 에 도 효과 가 있다.다음 에 우 리 는 이 진 상의 덧셈 을 비트 연산 으로 대체 하려 고 한다.첫 번 째 단 계 는 진 위 를 고려 하지 않 고 모든 사람 에 게 덧붙인다.0 더하기 0 과 1 더하기 1 의 결 과 는 모두 0,0 더하기 1 과 1 더하기 0 의 결 과 는 모두 1 이다.우 리 는 이것 이 다른 결과 와 같다 는 것 을 알 수 있다.이 어 두 번 째 진 위 를 고려 해 0 에 0,0 에 1,1 에 0 을 더 하면 진 위 는 생기 지 않 고 1 에 1 만 더 하면 앞으로 한 진 위 를 만들어 낸다.이때 우 리 는 두 개의 숫자 가 먼저 위치 와 연산 을 한 다음 에 한 명 을 왼쪽으로 이동 하 는 것 이 라 고 상상 할 수 있다.두 개 만 1 일 때 위치 와 결 과 는 1 이 고 나머지 는 0 이다.세 번 째 단 계 는 앞의 두 단계 의 결 과 를 덧붙인다.만약 우리 가 함수 Add()를 정의 한다 면,세 번 째 단 계 는 앞의 두 단계 의 결 과 를 입력 하여 자신 을 재 귀적 으로 호출 하 는 것 과 같다.
class Solution 
{ public:
	int sum = 0;
	int tmp=0;
	int Add(int num1, int num2) 
	{
		if (num2 == 0)
		{
			return num1;
		}
		else
		{
			//   ,       
			sum = num1 ^ num2;
			//   ,        
			tmp = (num1 & num2) << 1;
			//   ,sum tmp    
			return Add(sum, tmp);
		}
	}
//    :

/*
*     :        ,      ;
*     ,     :       ;
*          add  ,               ,
*    num2      ,   0 ,           num1.
*/

	 int Add(int num1, int num2)
	 {
		while (num2 != 0)
		{
			int temp = num1^num2;
			num2 = (num1&num2) << 1;
			num1 = temp;
		}
		return num1;
	}

좋은 웹페이지 즐겨찾기