Super Niven Numbers

• Difficulty Level : Expert
• Last Updated : 25 Jan, 2022

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 ` `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 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 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 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 digits = ``new` `Vector();`   `    ``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

 ``

Output:

`yes`

My Personal Notes arrow_drop_up
Related Articles