📜  奇怪的数字

📅  最后修改于: 2021-09-22 09:38:52             🧑  作者: 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 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 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 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 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 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 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 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 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


Javascript


输出:
Weird Number

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

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程