두 개의 정수 k와 n이 주어졌다고 가정합니다. 우리의 임무는 세 가지 작업을 수행하는 것입니다. 범위 n까지의 모든 숫자 쌍 사이의 비트 AND, 비트 OR 및 비트 XOR. 주어진 값 k보다 작은 두 쌍의 숫자 사이의 세 연산 모두의 최대값을 반환합니다.
따라서 입력이 n =5, k =5와 같으면 출력은 4 3 4가 됩니다.
5보다 작은 모든 숫자 쌍 간의 AND, OR 및 XOR 연산의 가장 큰 값은 각각 4, 3, 4입니다. 이러한 연산의 값이 주어진 값 k보다 작은 것을 볼 수 있습니다. 즉, 5입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 및최대값:=0 또는 최대값 =0, xor최대값 =0
- 값1 :=0, 값2 =0, 값3 =0
- i:=1 초기화의 경우, i <=n일 때 업데이트(i 1만큼 증가), 수행:
- 값1 :=i AND j
- 값2 :=i OR j
- 값3 :=i XOR j
- value1> andMax 및 value1
- andMax :=값1
- value2> orMax 및 value2
- 또는최대 :=값2
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> void solve(int n, int k) { int andMax = 0, orMax = 0, xorMax = 0; int value1 = 0, value2 = 0, value3 = 0; for (int i = 1; i <= n; i++) { for (int j = i+1; j <= n; j++) { value1 = i & j; value2 = i | j; value3 = i ^ j; if (value1 > andMax && value1 < k) andMax = value1; if (value2 > orMax && value2 < k) orMax = value2; if (value3 > xorMax && value3 < k) xorMax = value3; } } printf("%d %d %d ", andMax, orMax, xorMax); } int main() { solve(5, 5); return 0; }
입력
5, 5
출력
4 3 4