📜  怪异的数字

📅  最后修改于: 2021-04-29 17:40:21             🧑  作者: Mango

在数论中,一个怪异的数字是一个自然数,它很丰富,但不是半完美的。换句话说,该数字的适当除数(除数本身包括1,但不包括自身)的总和大于该数字,但是这些除数的子集都不等于该数字本身。

给定数字N,任务是检查数字是否怪异。

例子:

方法:检查数量是否充足。该方法已在此处讨论。完成检查后,检查数字是否为半完美。这里讨论了检查半完美数字的方法。

下面是上述方法的实现:

C++
// C++ program to check if the 
// number is weird or not
#include 
using namespace std;
  
// code to find all the factors of
// the number excluding the number itself
vector factors(int n)
{
    // vector to store the factors
    vector 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 not 
bool checkAbundant(int n)
{
    vector 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-perfecr or not
bool checkSemiPerfect(int n)
{
    vector 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 whther 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 diviors
            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 not 
bool checkweird(int n)
{
    if (checkAbundant(n) == true && 
        checkSemiPerfect(n) == false)
        return true;
    else
        return false;
}
  
// Driver Code
int main()
{
    int n = 70;
  
    if (checkweird(n))
        cout << "Weird Number";
    else
        cout << "Not Weird Number";
    return 0;
}


Java
// Java program to check if  
// the number is weird or not
import java.util.*;
class GFG
{ 
// code to find all the 
// factors of the number 
// excluding the number itself
static ArrayList factors(int n)
{
    // ArrayList to store
    // the factors
    ArrayList v = new ArrayList();
    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 not 
static boolean checkAbundant(int n)
{
    ArrayList 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-perfecr or not
static boolean checkSemiPerfect(int n)
{
    ArrayList 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 whther 
    // 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 
            // diviors
            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 not 
static boolean checkweird(int n)
{
    if (checkAbundant(n) == true && 
        checkSemiPerfect(n) == false)
        return true;
    else
        return false;
}
  
// Driver Code
public 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


Python3
# Python 3 program to check if the 
# number is weird or not
from math import sqrt
  
# code to find all the factors of
# the number excluding the number itself
def 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 not 
def 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-perfecr or not
def 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 whther 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 diviors
            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 not 
def checkweird(n):
    if (checkAbundant(n) == True and 
        checkSemiPerfect(n) == False):
        return True
    else:
        return False
  
# Driver Code
if __name__ == '__main__':
    n = 70
  
    if (checkweird(n)):
        print("Weird Number")
    else:
        print("Not Weird Number")
          
# This code is contributed by
# Surendra_Gangwar


C#
// C# program to check if 
// the number is weird or not
using System;
using System.Collections.Generic; 
  
class GFG
{ 
      
// code to find all the 
// factors of the number 
// excluding the number itself
static List factors(int n)
{
    // List to store
    // the factors
    List v = new List();
    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 not 
static Boolean checkAbundant(int n)
{
    List 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-perfecr or not
static Boolean checkSemiPerfect(int n)
{
    List 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 whther 
    // 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 
            // diviors
            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 not 
static Boolean checkweird(int n)
{
    if (checkAbundant(n) == true && 
        checkSemiPerfect(n) == false)
        return true;
    else
        return false;
}
  
// Driver Code
public 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


输出:
Weird Number

时间复杂度: O(N *因素数)
辅助空间: O(N *因子数量)