Giả sử chúng ta được cho trước hai số nguyên k và n. Nhiệm vụ của chúng tôi là thực hiện ba hoạt động; theo chiều kim bit VÀ, theo chiều kim loại HOẶC và theo chiều kim loại XOR giữa tất cả các cặp số cho đến phạm vi n. Chúng tôi trả về giá trị lớn nhất của cả ba phép toán giữa hai cặp số bất kỳ nhỏ hơn giá trị k đã cho.
Vì vậy, nếu đầu vào là n =5, k =5, thì đầu ra sẽ là 4 3 4.
Giá trị lớn nhất của các phép toán AND, OR và XOR giữa tất cả các cặp số nhỏ hơn 5 lần lượt là 4, 3 và 4. Chúng ta có thể thấy rằng giá trị của các phép toán này nhỏ hơn giá trị của k đã cho, là 5.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- andMax:=0, orMax =0, xorMax =0
- value1:=0, value2 =0, value3 =0
- để khởi tạo i:=1, khi i <=n, cập nhật (tăng i lên 1), thực hiện:
- value1:=i AND j
- value2:=i OR j
- value3:=i XOR j
- nếu value1> andMax và value1
- andMax:=value1
- nếu value2> hoặcMax và value2
- orMax:=value2
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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; }
Đầu vào
5, 5
Đầu ra
4 3 4