ในที่นี้เราต้องเขียนโปรแกรมที่ใช้เช็คว่าตัวเลขที่ให้มานั้นคูณ 3 หรือไม่
คำตอบทั่วไปคือคำตอบที่ไม่สำคัญ โดยบวกตัวเลขทั้งหมดของตัวเลขนั้นและหากผลรวมเป็นทวีคูณของสาม ตัวเลขจะหารด้วย 3 ลงตัว ไม่เช่นนั้นจะไม่ใช่ แต่วิธีนี้ไม่มีประสิทธิภาพสูงสุด
วิธีแก้ปัญหาที่มีประสิทธิภาพจะใช้การนับบิตในการแทนค่าเลขฐานสองของตัวเลข หากผลต่างระหว่างการนับ set bit ที่ตำแหน่งคี่กับการนับ set bit ที่ตำแหน่งคู่เป็นทวีคูณของ 3 แสดงว่าจำนวนนั้นเป็นผลคูณของ 3
เราจะใช้การวนซ้ำและเลื่อนบิตของตัวเลขและนับจำนวนบิตที่เป็นตำแหน่งคู่และคี่ สุดท้ายเราจะคืนเช็คหากผลต่างเป็นทวีคูณของสาม
มาดูตัวอย่างเพื่อทำความเข้าใจการนำไปใช้
อินพุต
n = 24
ผลลัพธ์
even
คำอธิบาย
binary representation = 11000 Evensetbits = 1 , oddsetbits = 1. Difference = 0, it is divisible.
โปรแกรมแสดงการใช้งานโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; int isDivisibleBy3(int n) { int oddBitCount = 0; int evenBitCount = 0; if (n < 0) n = -n; if (n == 0) return 1; if (n == 1) return 0; while (n) { if (n & 1) oddBitCount++; if (n & 2) evenBitCount++; n = n >> 2; } return isDivisibleBy3(oddBitCount - evenBitCount); } int main() { int n = 1241; cout<<"The number "<<n; if (isDivisibleBy3(n)) cout<<" is a multiple of 3"; else cout<<" is not a multiple of 3"; return 0; }
ผลลัพธ์
The number 1241 is not a multiple of 3