Con số gần như hoàn hảo còn được gọi là số bị thiếu ít nhất hoặc số bị lỗi nhẹ là một số trong đó tổng của tất cả các ước số (thêm 1 và chính số đó) phải bằng 2n-1 .
Trong bài toán này, chúng tôi sẽ xác định một thuật toán để kiểm tra xem một số có phải là một số gần như hoàn hảo hay không.
Hãy lấy một ví dụ để hiểu rõ hơn về khái niệm này,
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
Bây giờ, vấn đề là kiểm tra xem số đã cho có phải là số gần như hoàn hảo không hay không được giải bằng cách sử dụng logic của số gần như hoàn hảo, tức là nếu tổng của tất cả các ước của số bằng 2n -1 .
Thuật toán
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”
Ví dụ
#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"; }
Đầu ra
Is 16 an almost perfect number ? YES