Check whether a number is Quasiperfect number or not.
Last Updated :
11 Nov, 2023
A Quasiperfect number is a positive integer that is equal to the sum of all its proper divisors plus or minus one. In other words, a number n is quasiperfect if the sum of all its proper divisors is either n+1 or n-1.
Examples:
Input: 20
Output: NO
Explanation: The divisors of 20 are 1, 2, 4, 5, 10 and 20. The sum of these divisors except 20 is 1+2+4+5+10=22, which is not equal to 20-1 or 20+1. Therefore, 20 is not a quasiperfect number.
Input: 28
Output: YES
Explanation: 28 is a quasiperfect number because its divisor divisors are 1, 2, 4, 7, and 14, and the sum of these divisors is 28. Therefore 28 is a quasiperfect number.
Approach 1: Bruteforce Approach
To solve the problem follow the below idea:
The given approach is to check if a number is a Quasiperfect number or not. It iterates through all the possible divisors of the given number and calculates the sum of those divisors. If the sum of divisors is equal to the given number or less than one of that, it returns true, indicating that the given number is a Quasiperfect number.
Below are the steps for the above approach:
- Initialize a variable sum = 0.
- Run a for loop to iterate from 1 to n/2, and check if each number is a divisor of n. If it is, add it to the sum.
- Check if the sum is equal to n+1 or n-1, print YES else print NO.
Below is the Code of the above approach:
C++
#include <iostream>
using namespace std;
bool is_quasiperfect( int n)
{
int sum = 0;
for ( int i = 1; i < n; i++) {
if (n % i == 0) {
sum += i;
}
}
if (sum == n + 1 || sum == n - 1)
return true ;
else
return false ;
}
int main()
{
int n = 28;
if (is_quasiperfect(n)) {
cout << "YES" ;
}
else {
cout << "NO" ;
}
return 0;
}
|
Java
import java.io.*;
class GFG {
static boolean is_quasiperfect( int n)
{
int sum = 0 ;
for ( int i = 1 ; i < n; i++) {
if (n % i == 0 ) {
sum += i;
}
}
if (sum == n + 1 || sum == n - 1 ) {
return true ;
}
else {
return false ;
}
}
public static void main(String[] args)
{
int n = 28 ;
if (is_quasiperfect(n)) {
System.out.print( "YES" );
}
else {
System.out.print( "NO" );
}
}
}
|
Python3
def is_quasiperfect(n):
sum = 0
for i in range ( 1 , n):
if n % i = = 0 :
sum + = i
if sum = = n + 1 or sum = = n - 1 :
return True
else :
return False
n = 28
if is_quasiperfect(n):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
class GFG {
static bool is_quasiperfect( int n)
{
int sum = 0;
for ( int i = 1; i < n; i++) {
if (n % i == 0) {
sum += i;
}
}
if (sum == n + 1 || sum == n - 1) {
return true ;
}
else {
return false ;
}
}
public static void Main()
{
int n = 28;
if (is_quasiperfect(n)) {
Console.Write( "YES" );
}
else {
Console.Write( "NO" );
}
}
}
|
Javascript
function isQuasiperfect(n) {
let sum = 0;
for (let i = 1; i < n; i++) {
if (n % i === 0) {
sum += i;
}
}
return sum === n + 1 || sum === n - 1;
}
const n = 28;
if (isQuasiperfect(n)) {
console.log( "YES" );
} else {
console.log( "NO" );
}
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Approach 2: To solve the problem follow the below idea:
we can get a number divisors in √N time.
Below is the Code of the above approach:
C++
#include <iostream>
using namespace std;
bool is_quasiperfect( int n)
{
int sum = 0;
for ( int i = 1; i * i < n; i++) {
if (n % i == 0) {
sum += i;
sum += n / i;
}
}
if (sum == n + 1 || sum == n - 1)
return true ;
else
return false ;
}
int main()
{
int n = 28;
if (is_quasiperfect(n)) {
cout << "YES" ;
}
else {
cout << "NO" ;
}
return 0;
}
|
Java
import java.io.*;
class GFG {
public static boolean is_quasiperfect( int n)
{
int sum = 0 ;
for ( int i = 1 ; i * i < n; i++) {
if (n % i == 0 ) {
sum += i;
sum += n / i;
}
}
if (sum == n + 1 || sum == n - 1 ) {
return true ;
}
else {
return false ;
}
}
public static void main(String[] args)
{
int n = 28 ;
if (is_quasiperfect(n)) {
System.out.print( "YES" );
}
else {
System.out.print( "NO" );
}
}
}
|
Python3
def is_quasiperfect(n):
sum_divisors = 0
for i in range ( 1 , n):
if n % i = = 0 :
sum_divisors + = i
sum_divisors + = n / / i
if sum_divisors = = n + 1 or sum_divisors = = n - 1 :
return True
else :
return False
n = 28
if is_quasiperfect(n):
print ( "YES" )
else :
print ( "NO" )
|
C#
using System;
class GFG {
public static bool is_quasiperfect( int n)
{
int sum = 0;
for ( int i = 1; i * i < n; i++) {
if (n % i == 0) {
sum += i;
sum += n / i;
}
}
if (sum == n + 1 || sum == n - 1) {
return true ;
}
else {
return false ;
}
}
public static void Main()
{
int n = 28;
if (is_quasiperfect(n)) {
Console.Write( "YES" );
}
else {
Console.Write( "NO" );
}
}
}
|
Javascript
function is_quasiperfect(n) {
let sum = 0;
for (let i = 1; i * i < n; i++) {
if (n % i === 0) {
sum += i;
sum += n / i;
}
}
if (sum === n + 1 || sum === n - 1)
return true ;
else
return false ;
}
let n = 28;
if (is_quasiperfect(n)) {
console.log( "YES" );
}
else {
console.log( "NO" );
}
|
Time Complexity: O(√N) , since we can calculate number divisors in square-root(n) time.
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...