Skip to content
Related Articles

Related Articles

Super Niven Numbers
  • Last Updated : 14 Sep, 2020

Super Niven Number is a number N if it is divisible not only by the sum of its digits but also by the sum of any subset of its (nonzero) digits.
For example:

68040 is a Super Niven Number because it is divisible by 6, 8, 4, 6+8, 6+4, 4+8 and 6+4+8.

Check if N is a super niven number

Given a number N, the task is to check if N is an Super Niven Number or not. If N is a Super Niven Number then print “Yes” else print “No”.
Examples:

Input: N = 68040 
Output: Yes 
Explanation: 
68040 is divisible by 6, 8, 4, 6+8, 6+4, 4+8 and 6+4+8. 
and N begins also with ’25’.

Input: N = 72 
Output: No



Approach: :

  1. We will store all the digits of the Number N in an array arr
  2. Now We will find the sum of every subset of the array and check if the number N is divisible by all subset or not
  3. If N is not divisible by any of the subsets then return false else return true at last.

Below is the implementation of the above approach:

C++




// C++ implementagtion to check if a number
// is Super Niven Number or not.
  
#include <bits/stdc++.h>
using namespace std;
  
// Checks if sums of all subsets of digits array
// divides the number N
bool isDivBySubsetSums(vector<int> arr, int num)
{
    // to calculate length of array arr
    int n = arr.size();
  
    // There are totoal 2^n subsets
    long long total = 1 << n;
  
    // Consider all numbers from 0 to 2^n - 1
    for (long long i = 0; i < total; i++) {
        long long sum = 0;
  
        // Consider binary reprsentation of
        // current i to decide which elements
        // to pick.
        for (int j = 0; j < n; j++)
            if (i & (1 << j))
                sum += arr[j];
  
        // check sum of picked elements.
        if (sum != 0 && num % sum != 0)
            return false;
    }
    return true;
}
  
// Function to check if a number is 
// a super-niven number
bool isSuperNivenNum(int n)
{
    int temp = n;
    // to stor digits of N
    vector<int> digits;
  
    while (n != 0) {
        int digit = n % 10;
        digits.push_back(digit);
        n = n / 10;
    }
  
    return isDivBySubsetSums(digits, temp);
}
  
// Driver code
int main()
{
    int n = 500;
    if (isSuperNivenNum(n))
        cout << "yes";
    else
        cout << "No";
    return 0;
}

Java




// Java implementagtion to check if a number
// is Super Niven Number or not.
import java.util.*;
class GFG{
  
// Checks if sums of all subsets of digits array
// divides the number N
static boolean isDivBySubsetSums(Vector<Integer> arr, 
                                             int num)
{
    // to calculate length of array arr
    int n = arr.size();
  
    // There are totoal 2^n subsets
    long total = 1 << n;
  
    // Consider all numbers from 0 to 2^n - 1
    for (long i = 0; i < total; i++) 
    {
        long sum = 0;
  
        // Consider binary reprsentation of
        // current i to decide which elements
        // to pick.
        for (int j = 0; j < n; j++)
            if ((i & (1 << j)) > 0)
                sum += arr.get(j);
  
        // check sum of picked elements.
        if (sum != 0 && num % sum != 0)
            return false;
    }
    return true;
}
  
// Function to check if a number is 
// a super-niven number
static boolean isSuperNivenNum(int n)
{
    int temp = n;
    // to stor digits of N
    Vector<Integer> digits = new Vector<Integer>();
  
    while (n != 0)
    {
        int digit = n % 10;
        digits.add(digit);
        n = n / 10;
    }
  
    return isDivBySubsetSums(digits, temp);
}
  
// Driver code
public static void main(String[] args)
{
    int n = 500;
    if (isSuperNivenNum(n))
        System.out.print("yes");
    else
        System.out.print("No");
}
}
  
// This code is contributed by Amit Katiyar

Python3




# Python3 implementagtion to check if a 
# number is Super Niven Number or not.
  
# Checks if sums of all subsets of digits 
# array divides the number N
def isDivBySubsetSums(arr, num):
  
    # To calculate length of array arr
    n = len(arr)
  
    # There are totoal 2^n subsets
    total = 1 << n
  
    # Consider all numbers from 0 to 2^n - 1
    i = 0
    while i < total:
        sum = 0
  
        # Consider binary reprsentation of
        # current i to decide which elements
        # to pick.
        j = 0
        while j < n:
            if (i & (1 << j)):
                sum += arr[j]
                  
            j += 1
  
        # Check sum of picked elements.
        if (sum != 0) and (num % sum != 0):
            return False
              
        i += 1
          
    return True
  
# Function to check if a number is 
# a super-niven number
def isSuperNivenNum(n):
  
    temp = n
      
    # To store digits of N
    digits = []
      
    while (n > 1):
        digit = int(n) % 10
        digits.append(digit)
        n = n / 10
  
    return isDivBySubsetSums(digits, temp)
  
# Driver code
if __name__ == '__main__'
  
    n = 500
      
    if isSuperNivenNum(n):
        print("Yes")
    else:
        print("No")
  
# This code is contributed by jana_sayantan

C#




// C# implementagtion to check if a number
// is Super Niven Number or not.
using System;
using System.Collections.Generic;
  
class GFG{
   
// Checks if sums of all subsets of digits array
// divides the number N
static bool isDivBySubsetSums(List<int> arr, 
                                   int num)
{
    // to calculate length of array arr
    int n = arr.Count;
   
    // There are totoal 2^n subsets
    long total = 1 << n;
   
    // Consider all numbers from 0 to 2^n - 1
    for (long i = 0; i < total; i++) 
    {
        long sum = 0;
   
        // Consider binary reprsentation of
        // current i to decide which elements
        // to pick.
        for (int j = 0; j < n; j++)
            if ((i & (1 << j)) > 0)
                sum += arr[j];
   
        // check sum of picked elements.
        if (sum != 0 && num % sum != 0)
            return false;
    }
    return true;
}
   
// Function to check if a number is 
// a super-niven number
static bool isSuperNivenNum(int n)
{
    int temp = n;
    // to stor digits of N
    List<int> digits = new List<int>();
   
    while (n != 0)
    {
        int digit = n % 10;
        digits.Add(digit);
        n = n / 10;
    }
    return isDivBySubsetSums(digits, temp);
}
   
// Driver code
public static void Main(String[] args)
{
    int n = 500;
    if (isSuperNivenNum(n))
        Console.Write("yes");
    else
        Console.Write("No");
}
}
  
// This code is contributed by gauravrajput1
Output: 
yes

Reference: http://www.numbersaplenty.com/set/super_Niven_number/
 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up
Recommended Articles
Page :