Open In App

Super Niven Numbers

Last Updated : 10 Feb, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

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 a 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++ implementation 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 total 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 representation 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 store 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 implementation 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 total 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 representation 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 store 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 implementation 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 total 2^n subsets
    total = 1 << n
 
    # Consider all numbers from 0 to 2^n - 1
    i = 0
    while i < total:
        sum = 0
 
        # Consider binary representation 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# implementation 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 total 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 representation 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 store 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


Javascript




<script>
 
// Javascript implementation to check if a number
// is Super Niven Number or not.
 
// Checks if sums of all subsets of digits array
// divides the number N
function isDivBySubsetSums(arr, num)
{
    // to calculate length of array arr
    var n = arr.length;
 
    // There are total 2^n subsets
    var total = 1 << n;
 
    // Consider all numbers from 0 to 2^n - 1
    for (var i = 0; i < total; i++) {
        var sum = 0;
 
        // Consider binary representation of
        // current i to decide which elements
        // to pick.
        for (var 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
function isSuperNivenNum(n)
{
    var temp = n;
    // to store digits of N
    var digits = [];
 
    while (n != 0) {
        var digit = n % 10;
        digits.push(digit);
        n = parseInt(n / 10);
    }
 
    return isDivBySubsetSums(digits, temp);
}
 
// Driver code
var n = 500;
if (isSuperNivenNum(n))
    document.write("yes");
else
    document.write("No");
 
 
</script>


C++




// C++ implementation 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 total 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 representation 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 store 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 implementation 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 total 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 representation 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 implementation 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 total 2^n subsets
    total = 1 << n
 
    # Consider all numbers from 0 to 2^n - 1
    i = 0
    while i < total:
        sum = 0
 
        # Consider binary representation 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# implementation 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 total 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 representation 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


Javascript




<script>
 
// Javascript implementation to check if a number
// is Super Niven Number or not.
 
// Checks if sums of all subsets of digits array
// divides the number N
function isDivBySubsetSums(arr, num)
{
    // to calculate length of array arr
    var n = arr.length;
 
    // There are total 2^n subsets
    var total = 1 << n;
 
    // Consider all numbers from 0 to 2^n - 1
    for (var i = 0; i < total; i++) {
        var sum = 0;
 
        // Consider binary representation of
        // current i to decide which elements
        // to pick.
        for (var 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
function isSuperNivenNum(n)
{
    var temp = n;
    // to stor digits of N
    var digits = [];
 
    while (n != 0) {
        var digit = n % 10;
        digits.push(digit);
        n = parseInt(n / 10);
    }
 
    return isDivBySubsetSums(digits, temp);
}
 
// Driver code
var n = 500;
if (isSuperNivenNum(n))
    document.write("yes");
else
    document.write("No");
 
 
</script>


 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads