Superperfect Number

Given an integer n. Check whether the number n is superperfect number or not. A superperfect number is a positive integer which satisfies σ2(n) = σ(σ(n)) = 2n, where σ is divisor summatory function.

Input: n = 16
Output: yes
Explanation:
16 is a superperfect number as σ(16) = 1 + 2 + 4 + 8 + 16 = 31,
and σ(31) = 1 + 31 = 32, 
thus σ(σ(16)) = 32 = 2 × 16.

Input: n = 8
Output: no 
Explanation:
σ(8) = 1 + 2 + 4 + 8 = 15
and σ(15) = 1 + 3 + 5 + 15 = 24
thus ( σ(σ(8)) = 24 ) ≠ (2 * 8 = 26)
We strongly recommend that you click here and practice it, before moving on to the solution.

The idea is simply straightforward. We just iterate from 1 to sqrt(n) and find sum of all divisors of n, lets we call this sum as n1. Now we again need to iterate from 1 to sqrt(n1) and find sum of all divisors. After that we just need to check whether the resulted sum is equal to 2*n or not.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to check whether number is
// superperfect or not
#include<bits/stdc++.h>
using namespace std;
  
// Function to calculate sum of all divisors
int divSum(int num)
{
    // Final result of summation of divisors
    int result = 0;
  
    // find all divisors which divides 'num'
    for (int i=1; i*i <= num; ++i)
    {
        // if 'i' is divisor of 'num'
        if (num%i == 0)
        {
            // if both divisors are same then add
            // it only once else add both
            if (i == (num/i))
                result += i;
            else
                result += (i + num/i);
        }
    }
  
    return result;
}
  
// Returns true if n is Super Perfect else false.
bool isSuperPerfect(int n)
{
    // Find the sum of all divisors of number n
    int n1 = divSum(n);
  
    // Again find the sum of all divisors of n1
    // and check if sum is equal to n1
    return (2*n == divSum(n1));
}
  
//Driver code
int main()
{
    int n = 16;
    cout << (isSuperPerfect(n) ? "Yes\n" : "No\n");
  
    n = 6;
    cout << (isSuperPerfect(n) ? "Yes\n" : "No\n");
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to check whether number is
// superperfect or not
  
public class Divisors
{
    // Function to calculate sum of all divisors
    static int divSum(int num)
    {
        // Final result of summation of divisors
        int result = 0;
          
        // find all divisors which divides 'num'
        for (int i=1; i*i <= num; ++i)
        {
            // if 'i' is divisor of 'num'
            if (num%i == 0)
            {
                // if both divisors are same then add
                // it only once else add both
                if (i == (num/i))
                    result += i;
                else
                    result += (i + num/i);
            }
        }
        return result;
    }
      
    // Returns true if n is Super Perfect else false.
    static boolean isSuperPerfect(int n)
    {
        // Find the sum of all divisors of number n
        int n1 = divSum(n);
        // Again find the sum of all divisors of n1
        // and check if sum is equal to n1
        return (2*n == divSum(n1));
    }
      
    public static void main (String[] args)
    {
        int n = 16;
        System.out.printf((isSuperPerfect(n) ? "Yes\n" : "No\n"));
          
        n = 6;
        System.out.printf((isSuperPerfect(n) ? "Yes\n" : "No\n"));
    }
}
  
// This code is contributed by Saket Kumar

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to check whether number
# is superperfect or not
import math
  
# Function to calculate sum of all divisors
def divSum(num):
  
    # Final result of summation of divisors
    result = 0
  
    # find all divisors which divides 'num'
    sq = int(math.sqrt(num))
    for i in xrange(1, sq+1):
  
        # if 'i' is divisor of 'num'
        if num %i == 0:
  
            # if both divisors are same then add
            # it only once else add both
            if i == (num/i):
                result += i
            else:
                result += (i + num/i)
  
  
  
    return result
  
# Returns true if n is superperfect else false
def isSuperPerfect(n):
  
    # Find the sum of all divisors of number n
    n1 = divSum(n)
  
    # Again find the sum of all divisors of n1
    return divSum(n1) == 2*n
  
  
#Driver code
n = 16
print 'Yes' if isSuperPerfect(n) else 'No'
  
n = 6
print 'Yes' if isSuperPerfect(n) else 'No'

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to check whether number is
// superperfect or not
using System;
  
class Divisors
{
    // Function to calculate sum of all divisors
    static int divSum(int num)
    {
        // Final result of summation of divisors
        int result = 0;
          
        // find all divisors which divides 'num'
        for (int i = 1; i * i <= num; ++i)
        {
            // if 'i' is divisor of 'num'
            if (num % i == 0)
            {
                // if both divisors are same then add
                // it only once else add both
                if (i == (num / i))
                    result += i;
                else
                    result += (i + num / i);
            }
        }
        return result;
    }
      
    // Returns true if n is Super Perfect else false.
    static bool isSuperPerfect(int n)
    {
        // Find the sum of all divisors of number n
        int n1 = divSum(n);
        // Again find the sum of all divisors of n1
        // and check if sum is equal to n1
        return (2 * n == divSum(n1));
    }
      
    public static void Main ()
    {
        int n = 16;
        Console.WriteLine((isSuperPerfect(n) ? "Yes" : "No"));
          
        n = 6;
        Console.WriteLine((isSuperPerfect(n) ? "Yes" : "No"));
    }
}
  
// This code is contributed by vt_m.

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to check whether
// number is superperfect or not
  
// Function to calculate
// sum of all divisors
function divSum($num)
{
      
    // Final result of 
    // summation of divisors
    $result = 0;
  
    // find all divisors
    // which divides 'num'
    for ($i = 1; $i * $i <= $num; ++$i)
    {
          
        // if 'i' is divisor
        // of 'num'
        if ($num % $i == 0)
        {
              
            // if both divisors 
            // are same then add
            // it only once else 
            // add both
            if ($i == ($num / $i))
                $result += $i;
            else
                $result += ($i + $num/$i);
        }
    }
  
    return $result;
}
  
// Returns true if n is 
// Super Perfect else false.
function isSuperPerfect($n)
{
      
    // Find the sum of all 
    // divisors of number n
    $n1 = divSum($n);
  
    // Again find the sum 
    // of all divisors of n1
    // and check if sum is 
    // equal to n1
    return (2 * $n == divSum($n1));
}
  
    // Driver code
    $n = 16;
    $hh = (isSuperPerfect($n) ? "Yes\n" : "No\n");
        echo($hh);
  
    $n = 6;
    $hh=(isSuperPerfect($n) ? "Yes\n" : "No\n");
        echo($hh);
  
// This code is contributed by AJit
?>

chevron_right


Output:
Yes
No

Time complexity: O(sqrt(n + n1)) where n1 is sum of divisors of n.
Auxiliary space: O(1)



Facts about Supernumbers:

  1. If n is an even superperfect number, then n must be a power of 2 i.e., 2k such that 2k+1 – 1 is a Mersenne prime.
  2. It is not known whether there are any odd superperfect numbers. An odd superperfect number n would have to be a square number such that either n or σ(n) is divisible by at least three distinct primes. There are no odd superperfect numbers below 7×1024

Reference:
https://en.wikipedia.org/wiki/Superperfect_number

This article is contributed by Shubham Bansal. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up

Improved By : jit_t



Article Tags :
Practice Tags :


Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.