C Program to Check Perfect Number or Not

Perfect number in C

Basically, a perfect number is a positive number that is equal to the sum of all its divisors(excluding itself) excluding itself.

We have to find all divisors of that number and find their sum if the sum of divisors is equal to the number. We will look at different ways of coding Perfect Number in C.

Ex:- Take a number:  6
6 is a perfect number as 1 + 2 + 3 = 6.
Ex:- Take a number: 28

28 is a perfect number as 1 + 2 + 4 + 7 + 14 = 28
perfect number or not in c

Methods to find 

  • Method 1: Using For Loop, Linear traversal between [1, num -1] to find factors
  • Method 2: Using While Loop, Linear traversal between [1, num – 1] to find factors
  • Method 3: Linear traversal between [1, num/2] to find factors
  • Method 4: Using Function and Linear traversal between [1, num/2] to find factors
  • Method 5: Uses recursion in C
  • Method 6: Linear traversal between [1, √num] but using a pair-based approach
Perfect Number in C

Method 1 (For Loop)

For a user input num

  1. Using loop in the iteration of (i) traverse from [1, num-1]
  2. Add all (i) that divide num perfectly (num % i == 0)

Method 1 C Program:-

Lets have a look at the program below –

Run
#include <stdio.h>

int main ()
{
    int num = 28, sum = 0;
    // iteratively check for all numbers in range [1, 27]
    for(int i = 1; i < num; i++){
        // check if i is a divisor, if yes then add to sum
        if(num % i == 0)
            sum = sum + i;
    }
    
    if(sum == num)
        printf("%d is a perfect number",num);
    else
        printf("%d is not a perfect number",num);
    

}
// Time complexity: O(N)
// Space complexity: O(1)

Output:-

28 is a perfect number

Method 2 (While Loop)

Uses the same logic as method 1.1 but rather than a for loop uses a while loop.

Method 2 C Program:-

Lets have a look at the program for perfect number in C below –

Run
#include <stdio.h>

int main ()
{
    int num = 28, sum = 0, i = 1;
    
    // iteratively check for all numbers if they are divisors
    while(i < num)  
    {
        // check if i is a divisor, if yes then add to sum
        if(num % i == 0)  
            sum = sum + i;  
        i++;  
    }  
    
    if(sum == num)
        printf("%d is a perfect number",num);
    else
        printf("%d is not a perfect number",num);
    

}
// Time complexity: O(N)
// Space complexity: O(1)

Output:-

28 is a perfect number

Method 3 In Range [1, num/2]

This method uses optimization that all divisors of the number(excluding itself) can be found in the range [1, num/2]

Method 3 C Program:-

Lets have a look at the program for perfect number in C below –

Run
#include <stdio.h> 

int main ()
{
    int num = 28, sum = 0, i = 1;
    
    // all divisors of the numbers (excluding the number itself)
    // can be found before num/2
    // note we will need to use '=' sign as for even numbers
    // like 28, half of the number i.e 14 will also be the divisor    
    while(i <= num/2)  
    {
        // check if i is a divisor, if yes then add to sum
        if(num % i == 0)  
            sum = sum + i;  
        i++;  
    }  
    
    if(sum == num)
        printf("%d is a perfect number",num);
    else
        printf("%d is not a perfect number",num);
    

}
// Time complexity: O(N)
// Space complexity: O(1)

Output:-

28 is a perfect number

Method 4 In Range [1, num/2] using a function

In this method, we use a function.

This method also uses optimization that all divisors of the number(excluding itself) can be found in the range [1, num/2]

Method 4 C Program:-

Lets have a look at the program for perfect number in C below –

Run
#include <stdio.h>

int isPerfect(int num)
{
    int sum = 0;
    
    // all divisors of num(excluding itself) can be found before num/2
    // remember put = sign as for even numbers like 28
    // half of it i.e. 14 would be divisor too e
    for (int i = 1; i <= num/2; i++){
        if (num % i == 0)
            sum = sum + i;
        }

    if (sum == num)
        return 1;

    return 0;
}
int main ()
{
    int num = 28, sum = 0, i = 1;
    
    if(isPerfect(num))
        printf("%d is a perfect number",num);
    else
        printf("%d is not a perfect number",num);
    

}
// Time complexity: O(N)
// Space complexity: O(1)

Output:-

28 is a perfect number

Method 5

This method uses recursion in C

Method 5 C Program:-

Lets have a look at the program for perfect number in C below –

Run
#include <stdio.h>

static int sum = 0;
int getSumDivisors(long num, int i)
{
    // since, all factors can be found will num/2
    // we will only check in this range
    if(i <= num/2)
    {
        if(num % i ==0)
            sum = sum + i;

        i++;
        // recursively call isPerfect
        getSumDivisors(num, i);
    }

    //returns the sum
    // when i becomes > num/2
    return sum;
}

int main ()
{
    int num = 28;
    
    if(getSumDivisors(num, 1) == num)
        printf("%d is a perfect number",num);
    else
        printf("%d is not a perfect number",num);
    
    return 0;
}
// Time complexity: O(N)
// Space complexity: O(1)
// Auxiliary Space complexity: O(N) due to function call stack

Output:-

28 is a perfect number

Method 6

This method uses observations that all factors come in pairs.

Method 6 C Program:-

Run
#include <stdio.h>
#include <math.h>

int main ()
{
    int num = 28, sum = 0;
    
    for(int i = 1; i < sqrt(num); i++)
    {
        if (num % i == 0)
        {
            // For num : (1, num) will always be pair of divisor
            // acc to def., we must ignore adding num itself as divisor
            // when calculating for perfect number
            if(i == 1)
                sum = sum + i;
            
            // Example For 100 (10,10)  will be one pair
            // But, we should add value to the sum just once
            else if(i == num/i)
                sum = sum + i;
            
            // add both pairs as divisors
            // For any divisor i, num/i will also be a divisor
            else
                sum = sum + i + num/i;
        }
    }
    
    if(sum == num)
        printf("%d is a perfect number",num);
    else
        printf("%d is not a perfect number",num);
    

}
// Time complexity: O(sqrt(N))
// Space complexity: O(1)

Output:-

28 is a perfect number

7 comments on “C Program to Check Perfect Number or Not”


  • CHENGAPPA

    #include
    int main()
    {
    int i,num,sum=0,temp;
    printf(“Enter the number :\n”);
    scanf(“%d”,&num);
    temp=num;
    for(i=1;i<num;i++)
    {
    if(num%i==0)
    {
    sum=sum+i;
    }
    }
    if(sum==temp)
    printf("It is a Perfect Number");
    else
    printf("It is not a Perfect Number");
    return 0;
    }


  • Mohammed Monis

    Perfect number in Python:
    num = int(input(“Enter a number : “))
    factors = []
    for i in range(1, num+1):
    if num % i == 0:
    factors.append(i)
    print(factors)

    l = len(factors)
    f1 = factors[:l-1]
    print(f1)
    perfect_num = 0
    for i in f1:
    perfect_num = perfect_num + i
    print(perfect_num)

    if num == perfect_num:
    print(“It is a perfect number”)
    else:
    print(“It is not a perfect number”)


  • Narahari

    There is no error in the code but at the time of execution its not displaying the output
    Alternate code using for loop
    #include
    int main()
    {
    int n,i,perfect=0;
    printf(“enter a number”);
    scanf(“%d”,&n);
    for(i=1;i<n;i++)
    {
    if(n%i==0)
    {
    perfect=perfect+i;

    }
    }
    if(perfect==n)
    {
    printf(" %d is perfect number", perfect);
    }
    else
    {
    printf(" %d is not perfect number",n);
    }
    return 0;
    }


  • Pogakula

    #python3
    def perfect(num):
    return sum([i for i in range(1,num) if num%i==0])==num
    n=int(input())
    print(perfect(n))


  • 17-485

    perfect number using python:

    n = int(input(“Enter any number: “))
    sum1 = 0
    for i in range(1, n):
    if(n % i == 0):
    sum1 = sum1 + i
    if (sum1 == n):
    print(“The number is a Perfect number!”)
    else:
    print(“The number is not a Perfect number!”)