Weird Number - GeeksforGeeks

08 Sep, 2021
In number theory, a weird number is a natural number that is abundant but not semiperfect. In other words, the sum of the proper divisors (divisors including 1 but not itself) of the number is greater than the number, but no subset of those divisors sums to the number itself. Given a number N, the task is to check if the number is weird or not. 
Examples: 
Input: 40 Output: The number is not weird 1+4+5+10+20=40, hence it is not weird. 
Input: 70 Output: The number is Weird The smallest weird number is 70. Its proper divisors are 1, 2, 5, 7, 10, 14, and 35; these sum to 74, but no subset of these sums to 70. The number 12, for example, is abundant but not weird, because the proper divisors of 12 are 1, 2, 3, 4, and 6, which sum to 16; but 2+4+6 = 12. The first few weird numbers are 70, 836, 4030, 5830, 7192, 7912, 9272, 10430, 10570, 10792, 10990, 11410, 11690, 12110, 12530, 12670, 13370, 13510, ...
Approach: Check if the number is abundant or not. The approach has been discussed here. Once the checking has been done, check if the number is semiperfect or not. The approach for checking semiperfect numbers has been discussed here. Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ program to check if the// number is weird or not#include <bits/stdc++.h>using namespace std; // code to find all the factors of// the number excluding the number itselfvector<int> factors(int n){    // vector to store the factors    vector<int> v;    v.push_back(1);     // note that this loop runs till sqrt(n)    for (int i = 2; i <= sqrt(n); i++) {         // if the value of i is a factor        if (n % i == 0) {            v.push_back(i);             // condition to check the            // divisor is not the number itself            if (n / i != i) {                v.push_back(n / i);            }        }    }    // return the vector    return v;} // Function to check if the number// is abundant or notbool checkAbundant(int n){    vector<int> v;     int sum = 0;     // find the divisors using function    v = factors(n);     // sum all the factors    for (int i = 0; i < v.size(); i++) {        sum += v[i];    }     // check for abundant or not    if (sum > n)        return true;    else        return false;} // Function to check if the// number is semi-perfect or notbool checkSemiPerfect(int n){    vector<int> v;     // find the divisors    v = factors(n);     // sorting the vector    sort(v.begin(), v.end());     int r = v.size();     // subset to check if no is semiperfect    bool subset[r + 1][n + 1];     // initialising 1st column to true    for (int i = 0; i <= r; i++)        subset[i][0] = true;     // initialing 1st row except zero position to 0    for (int i = 1; i <= n; i++)        subset[0][i] = false;     // loop to find whether the number is semiperfect    for (int i = 1; i <= r; i++) {        for (int j = 1; j <= n; j++) {             // calculation to check if the            // number can be made by summation of divisors            if (j < v[i - 1])                subset[i][j] = subset[i - 1][j];            else {                subset[i][j] = subset[i - 1][j] ||                               subset[i - 1][j - v[i - 1]];            }        }    }     // if not possible to make the    // number by any combination of divisors    if ((subset[r][n]) == 0)        return false;    else        return true;} // Function to check for// weird or notbool checkweird(int n){    if (checkAbundant(n) == true &&        checkSemiPerfect(n) == false)        return true;    else        return false;} // Driver Codeint main(){    int n = 70;     if (checkweird(n))        cout << "Weird Number";    else        cout << "Not Weird Number";    return 0;}
// Java program to check if // the number is weird or notimport java.util.*;class GFG{// code to find all the// factors of the number// excluding the number itselfstatic ArrayList<Integer> factors(int n){    // ArrayList to store    // the factors    ArrayList<Integer> v = new ArrayList<Integer>();    v.add(1);     // note that this loop    // runs till sqrt(n)    for (int i = 2;             i <= Math.sqrt(n); i++)    {         // if the value of        // i is a factor        if (n % i == 0)        {            v.add(i);             // condition to check            // the divisor is not            // the number itself            if (n / i != i)            {                v.add(n / i);            }        }    }         // return the ArrayList    return v;} // Function to check if the// number is abundant or notstatic boolean checkAbundant(int n){    ArrayList<Integer> v;     int sum = 0;     // find the divisors    // using function    v = factors(n);     // sum all the factors    for (int i = 0; i < v.size(); i++)    {        sum += v.get(i);    }     // check for abundant    // or not    if (sum > n)        return true;    else        return false;} // Function to check if the// number is semi-perfect or notstatic boolean checkSemiPerfect(int n){    ArrayList<Integer> v;     // find the divisors    v = factors(n);     // sorting the ArrayList    Collections.sort(v);     int r = v.size();     // subset to check if    // no is semiperfect    boolean subset[][] = new boolean[r + 1][n + 1];     // initialising 1st    // column to true    for (int i = 0; i <= r; i++)        subset[i][0] = true;     // initialing 1st row except    // zero position to 0    for (int i = 1; i <= n; i++)        subset[0][i] = false;     // loop to find whether    // the number is semiperfect    for (int i = 1; i <= r; i++)    {        for (int j = 1; j <= n; j++)        {             // calculation to check            // if the number can be            // made by summation of            // divisors            if (j < v.get(i - 1))                subset[i][j] = subset[i - 1][j];            else {                subset[i][j] = subset[i - 1][j] ||                               subset[i - 1][j -                                v.get(i - 1)];            }        }    }     // if not possible to make    // the number by any    // combination of divisors    if ((subset[r][n]) == false)        return false;    else        return true;} // Function to check// for weird or notstatic boolean checkweird(int n){    if (checkAbundant(n) == true &&        checkSemiPerfect(n) == false)        return true;    else        return false;} // Driver Codepublic static void main(String args[]){    int n = 70;     if (checkweird(n))        System.out.println("Weird Number");    else        System.out.println("Not Weird Number");}} // This code is contributed// by Arnab Kundu
# Python 3 program to check if the# number is weird or notfrom math import sqrt # code to find all the factors of# the number excluding the number itselfdef factors(n):         # vector to store the factors    v = []    v.append(1)     # note that this loop runs till sqrt(n)    for i in range(2, int(sqrt(n)) + 1, 1):                 # if the value of i is a factor        if (n % i == 0):            v.append(i);             # condition to check the            # divisor is not the number itself            if (int(n / i) != i):                v.append(int(n / i))     # return the vector    return v # Function to check if the number# is abundant or notdef checkAbundant(n):    sum = 0     # find the divisors using function    v = factors(n)     # sum all the factors    for i in range(len(v)):        sum += v[i]     # check for abundant or not    if (sum > n):        return True    else:        return False # Function to check if the# number is semi-perfect or notdef checkSemiPerfect(n):         # find the divisors    v = factors(n)     # sorting the vector    v.sort(reverse = False)    r = len(v)     # subset to check if no is semiperfect    subset = [[0 for i in range(n + 1)]                 for j in range(r + 1)]     # initialising 1st column to true    for i in range(r + 1):        subset[i][0] = True     # initialing 1st row except zero position to 0    for i in range(1, n + 1):        subset[0][i] = False     # loop to find whether the number is semiperfect    for i in range(1, r + 1):        for j in range(1, n + 1):                         # calculation to check if the            # number can be made by summation of divisors            if (j < v[i - 1]):                subset[i][j] = subset[i - 1][j]            else:                subset[i][j] = (subset[i - 1][j] or                                subset[i - 1][j - v[i - 1]])     # if not possible to make the    # number by any combination of divisors    if ((subset[r][n]) == 0):        return False    else:        return True # Function to check for# weird or notdef checkweird(n):    if (checkAbundant(n) == True and        checkSemiPerfect(n) == False):        return True    else:        return False # Driver Codeif __name__ == '__main__':    n = 70     if (checkweird(n)):        print("Weird Number")    else:        print("Not Weird Number")         # This code is contributed by# Surendra_Gangwar
// C# program to check if// the number is weird or notusing System;using System.Collections.Generic; class GFG{     // code to find all the// factors of the number// excluding the number itselfstatic List<int> factors(int n){    // List to store    // the factors    List<int> v = new List<int>();    v.Add(1);     // note that this loop    // runs till sqrt(n)    for (int i = 2;            i <= Math.Sqrt(n); i++)    {         // if the value of        // i is a factor        if (n % i == 0)        {            v.Add(i);             // condition to check            // the divisor is not            // the number itself            if (n / i != i)            {                v.Add(n / i);            }        }    }         // return the List    return v;} // Function to check if the// number is abundant or notstatic Boolean checkAbundant(int n){    List<int> v;     int sum = 0;     // find the divisors    // using function    v = factors(n);     // sum all the factors    for (int i = 0; i < v.Count; i++)    {        sum += v[i];    }     // check for abundant    // or not    if (sum > n)        return true;    else        return false;} // Function to check if the// number is semi-perfect or notstatic Boolean checkSemiPerfect(int n){    List<int> v;     // find the divisors    v = factors(n);     // sorting the List    v.Sort();     int r = v.Count;     // subset to check if    // no is semiperfect    Boolean [,]subset = new Boolean[r + 1,n + 1];     // initialising 1st    // column to true    for (int i = 0; i <= r; i++)        subset[i,0] = true;     // initialing 1st row except    // zero position to 0    for (int i = 1; i <= n; i++)        subset[0,i] = false;     // loop to find whether    // the number is semiperfect    for (int i = 1; i <= r; i++)    {        for (int j = 1; j <= n; j++)        {             // calculation to check            // if the number can be            // made by summation of            // divisors            if (j < v[i-1])                subset[i,j] = subset[i - 1,j];            else {                subset[i,j] = subset[i - 1,j] ||                            subset[i - 1,j -                                v[i-1]];            }        }    }     // if not possible to make    // the number by any    // combination of divisors    if ((subset[r,n]) == false)        return false;    else        return true;} // Function to check// for weird or notstatic Boolean checkweird(int n){    if (checkAbundant(n) == true &&        checkSemiPerfect(n) == false)        return true;    else        return false;} // Driver Codepublic static void Main(String []args){    int n = 70;     if (checkweird(n))        Console.WriteLine("Weird Number");    else        Console.WriteLine("Not Weird Number");}} // This code is contributed by Princi Singh
<script> // Javascript program to check if the// number is weird or not // code to find all the factors of// the number excluding the number itselffunction factors(n){    // vector to store the factors    var v = [];    v.push(1);     // note that this loop runs till sqrt(n)    for (var i = 2; i <= Math.sqrt(n); i++) {         // if the value of i is a factor        if (n % i == 0) {            v.push(i);             // condition to check the            // divisor is not the number itself            if (n / i != i) {                v.push(n / i);            }        }    }    // return the vector    return v;} // Function to check if the number// is abundant or notfunction checkAbundant(n){    var v = [];     var sum = 0;     // find the divisors using function    v = factors(n);     // sum all the factors    for (var i = 0; i < v.length; i++) {        sum += v[i];    }     // check for abundant or not    if (sum > n)        return true;    else        return false;} // Function to check if the// number is semi-perfect or notfunction checkSemiPerfect(n){    var v = [];     // find the divisors    v = factors(n);     // sorting the vector    v.sort()     var r = v.length;     // subset to check if no is semiperfect    var subset = Array.from(Array(r+1), ()=>Array(n+1));     // initialising 1st column to true    for (var i = 0; i <= r; i++)        subset[i][0] = true;     // initialing 1st row except zero position to 0    for (var i = 1; i <= n; i++)        subset[0][i] = false;     // loop to find whether the number is semiperfect    for (var i = 1; i <= r; i++) {        for (var j = 1; j <= n; j++) {             // calculation to check if the            // number can be made by summation of divisors            if (j < v[i - 1])                subset[i][j] = subset[i - 1][j];            else {                subset[i][j] = subset[i - 1][j] ||                               subset[i - 1][j - v[i - 1]];            }        }    }     // if not possible to make the    // number by any combination of divisors    if ((subset[r][n]) == 0)        return false;    else        return true;} // Function to check for// weird or notfunction checkweird(n){    if (checkAbundant(n) == true &&        checkSemiPerfect(n) == false)        return true;    else        return false;} // Driver Codevar n = 70;if (checkweird(n))    document.write( "Weird Number");else    document.write( "Not Weird Number");  </script>
Weird Number
 
Time Complexity: O(N * number of factors) Auxiliary Space: O(N * number of factors) 
andrew1234
SURENDRA_GANGWAR
princi singh
rutvik_56
gulshankumarar231
surindertarika1234
simmytarika5
Algorithms-Dynamic Programming
factor
Numbers
subset
Dynamic Programming
Dynamic Programming
subset
Numbers
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Bellman–Ford Algorithm | DP-23
Floyd Warshall Algorithm | DP-16
Coin Change | DP-7
Matrix Chain Multiplication | DP-8
Longest Palindromic Substring | Set 1
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Edit Distance | DP-5
Sieve of Eratosthenes
Overlapping Subproblems Property in Dynamic Programming | DP-1
Maximum size square sub-matrix with all 1s