คำอธิบายปัญหา
สมมติว่าเราได้รับจำนวนเต็มสองจำนวนคือ k และ n งานของเราคือการทำการดำเนินการ 3 แบบ ได้แก่ บิตเวิร์ส AND, บิตเวิร์ส OR และบิตเวิร์ส XOR ระหว่างคู่ของตัวเลขทั้งหมดที่อยู่ในช่วง 1 ถึง n จากนั้นคืนค่าสูงสุดของทั้งสามการดำเนินการที่มีค่าน้อยกว่า k
ตัวอย่าง
หากอินพุตเป็น n = 5, k = 5 ผลลัพธ์ที่ได้จะเป็น 4 3 4
ค่าสูงสุดของการดำเนินการ AND, OR และ XOR ระหว่างคู่ของตัวเลขที่น้อยกว่า 5 คือ 4, 3 และ 4 ตามลำดับ ซึ่งทั้งหมดน้อยกว่าค่า k ที่กำหนดไว้ (5)
ขั้นตอนการแก้ปัญหา
- กำหนดค่าเริ่มต้น: andMax = 0, orMax = 0, xorMax = 0
- ใช้ลูปซ้อน (nested loop) วนลูป i จาก 1 ถึง n และ j จาก i+1 ถึง n
- คำนวณค่าการดำเนินการบิตเวิร์ส:
- value1 = i & j (AND)
- value2 = i | j (OR)
- value3 = i ^ j (XOR)
- อัปเดตค่าสูงสุดถ้าผลลัพธ์มากกว่าค่าปัจจุบันและน้อยกว่า k
- แสดงผลลัพธ์ andMax, orMax, xorMax
โค้ดตัวอย่าง
#include <stdio.h>
void solve(int n, int k) {
int andMax = 0, orMax = 0, xorMax = 0;
int value1, value2, value3;
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