เลขเกือบสมบูรณ์ ยังทราบกันดีว่าจำนวนที่ขาดน้อยที่สุดหรือจำนวนที่มีข้อบกพร่องเล็กน้อยคือตัวเลขที่ผลรวมของตัวหารทั้งหมด ( บวก 1 และตัวเลขเอง ) ควรเท่ากับ 2n-1 .
ในปัญหานี้ เราจะกำหนดอัลกอริธึมเพื่อตรวจสอบว่าตัวเลขนั้นเป็นจำนวนที่เกือบจะสมบูรณ์หรือไม่
มาดูตัวอย่างเพื่อทำความเข้าใจแนวคิดกันดีกว่า
Input : 16 Output : yes Explanation : Divisors of 16 are 1, 2, 4, 8, 16. Sum = 1 + 2 + 4 + 8 + 16 = 31 n = 16 ; 2n-1 = 2*16 - 1 = 31 Input : 12 Output : No Explanation : Divisors of 12 are 1, 2, 3, 4, 6, 12. Sum = 1+2+3+4+6+12 = 26 n = 12 ; 2n-1 = 2*12 - 1 = 23
ทีนี้ ปัญหาในการตรวจสอบว่าตัวเลขที่กำหนดนั้นเป็นจำนวนที่เกือบจะสมบูรณ์ .หรือไม่ หรือไม่แก้โดยใช้ตรรกะของจำนวนที่เกือบสมบูรณ์ เช่น ถ้าผลรวมของตัวหารทั้งหมดของตัวเลขเท่ากับ 2n -1 .
อัลกอริทึม
Step 1 : Calculate the sum of all divisors of the number. Step 2 : Calculate the value of val = 2n-1. Step 3 : if sum == val -> print “YES” Step 4 : else print “NO”
ตัวอย่าง
#include <iostream>
using namespace std;
void almostPerfectNumber(int n) ;
int main(){
int n = 16;
cout<<"Is "<<n<<" an almost perfect number ?\n";
almostPerfectNumber(n) ;
}
void almostPerfectNumber(int n){
int divisors = 0;
for (int i = 1; i <= n; i++) {
if (n % i == 0)
divisors += i;
}
if (divisors == 2 * n - 1)
cout<<"YES";
else
cout<<"NO";
} ผลลัพธ์
Is 16 an almost perfect number ? YES