Número de aspirante

Dado un número n, debemos verificar si n es un número aspirante o no. El número n se llama número aspirante si su secuencia alícuota termina en un número perfecto y no es un número perfecto en sí mismo. Los primeros números aspirantes son: 25, 95, 119, 143, 417, 445, 565, 608, 650, 652….

Ejemplos:  

Input : 25
Output : Yes.
Explanation : Terminating number of 
aliquot sequence of 25 is 6 which is 
perfect number.

Input :  24
Output : No.
Explanation : Terminating number of 
aliquot sequence of 24 is 0 which is 
not a perfect number.

Enfoque: primero encontramos el número final de la secuencia alícuota de la entrada dada y luego verificamos si es un número perfecto o no (según la definición). A continuación se muestra la implementación para verificar un número aspirante.  

C++

// C++ implementation to check whether
// a number is aspiring or not
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate sum of all proper
// divisors
int getSum(int n)
{
    int sum = 0; // 1 is a proper divisor
 
    // Note that this loop runs till square root
    // of n
    for (int i = 1; i <= sqrt(n); i++) {
        if (n % i == 0) {
 
            // If divisors are equal, take only one
            // of them
            if (n / i == i)
                sum = sum + i;
 
            else // Otherwise take both
            {
                sum = sum + i;
                sum = sum + (n / i);
            }
        }
    }
 
    // calculate sum of all proper divisors only
    return sum - n;
}
 
// Function to get last number of Aliquot Sequence.
int getAliquot(int n)
{
    unordered_set<int> s;
    s.insert(n);
 
    int next = 0;
    while (n > 0) {
 
        // Calculate next term from previous term
        n = getSum(n);
 
        if (s.find(n) != s.end())
            return n;       
 
        s.insert(n);
    }
    return 0;
}
 
// Returns true if n is perfect
bool isPerfect(int n)
{
    // To store sum of divisors
    long long int sum = 1;
 
    // Find all divisors and add them
    for (long long int i = 2; i * i <= n; i++)
        if (n % i == 0)
            sum = sum + i + n / i;
 
    // If sum of divisors is equal to
    // n, then n is a perfect number
    if (sum == n && n != 1)
        return true;
 
    return false;
}
 
// Returns true if n is aspiring
// else returns false
bool isAspiring(int n)
{
    // checking condition for aspiring
    int alq = getAliquot(n);
    if (isPerfect(alq) && !isPerfect(n))
        return true;
    else
        return false;
}
 
// Driver program
int main()
{
    int n = 25;
    if (isAspiring(n))
        cout << "Aspiring" << endl;
    else
        cout << "Not Aspiring" << endl;
 
    return 0;
}

Java

// Java implementation to check whether
// a number is aspiring or not
import java.util.*;
 
class GFG
{
 
    // Function to calculate sum of
    //  all proper divisors
    static int getSum(int n)
    {
        int sum = 0; // 1 is a proper divisor
 
        // Note that this loop runs till 
        // square root of n
        for (int i = 1; i <= Math.sqrt(n); i++)
        {
            if (n % i == 0)
            {
 
                // If divisors are equal,
                // take only one of them
                if (n / i == i)
                {
                    sum = sum + i;
                }
                else // Otherwise take both
                {
                    sum = sum + i;
                    sum = sum + (n / i);
                }
            }
        }
 
        // calculate sum of all
        // proper divisors only
        return sum - n;
    }
 
    // Function to get last number
    // of Aliquot Sequence.
    static int getAliquot(int n)
    {
        TreeSet<Integer> s = new TreeSet<Integer>();
        s.add(n);
 
        int next = 0;
        while (n > 0)
        {
 
            // Calculate next term from previous term
            n = getSum(n);
 
            if (s.contains(n) & n != s.last())
            {
                return n;
            }
 
            s.add(n);
        }
        return 0;
    }
 
    // Returns true if n is perfect
    static boolean isPerfect(int n)
    {
        // To store sum of divisors
        int sum = 1;
 
        // Find all divisors and add them
        for (int i = 2; i * i <= n; i++)
        {
            if (n % i == 0)
            {
                sum = sum + i + n / i;
            }
        }
 
        // If sum of divisors is equal to
        // n, then n is a perfect number
        if (sum == n && n != 1)
        {
            return true;
        }
 
        return false;
    }
 
    // Returns true if n is aspiring
    // else returns false
    static boolean isAspiring(int n)
    {
         
        // checking condition for aspiring
        int alq = getAliquot(n);
        if (isPerfect(alq) && !isPerfect(n))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int n = 25;
        if (isAspiring(n))
        {
            System.out.println("Aspiring");
        }
        else
        {
            System.out.println("Not Aspiring");
        }
    }
}
 
/* This code has been contributed
by PrinciRaj1992*/

Python3

# Python3 implementation to check whether
# a number is aspiring or not
 
# Function to calculate sum of all proper
# divisors
def getSum(n):
   
  # 1 is a proper divisor
  sum = 0
   
  # Note that this loop runs till
  # square root of n
  for i in range(1, int((n) ** (1 / 2)) + 1):
    if not n % i:
       
      # If divisors are equal, take
      # only one of them
      if n // i == i:
        sum += i
         
      # Otherwise take both
      else:
        sum += i
        sum += (n // i)
         
  # Calculate sum of all proper
  # divisors only
  return sum - n
 
# Function to get last number
# of Aliquot Sequence.
def getAliquot(n):
   
  s = set()
  s.add(n)
  next = 0
   
  while (n > 0):
     
    # Calculate next term from
    # previous term
    n = getSum(n)
     
    if n not in s:
      return n 
 
    s.add(n)
     
  return 0
 
# Returns true if n is perfect
def isPerfect(n):
   
  # To store sum of divisors
  sum = 1
   
  # Find all divisors and add them
  for i in range(2, int((n ** (1 / 2))) + 1):
    if not n % i:
      sum += (i + n // i)
       
  # If sum of divisors is equal to
  # n, then n is a perfect number
  if sum == n and n != 1:
    return True
   
  return False
 
# Returns true if n is aspiring
# else returns false
def isAspiring(n):
   
  # Checking condition for aspiring
  alq = getAliquot(n)
   
  if (isPerfect(alq) and not isPerfect(n)):
    return True
  else:
    return False
 
# Driver Code
n = 25
 
if (isAspiring(n)):
  print("Aspiring")
else:
  print("Not Aspiring")
 
# This code is contributed by rohitsingh07052

C#

// C# implementation to check whether
// a number is aspiring or not
using System;
using System.Collections.Generic;
class GFG
{
 
    // Function to calculate sum of
    //  all proper divisors
    static int getSum(int n)
    {
        int sum = 0; // 1 is a proper divisor
 
        // Note that this loop runs till 
        // square root of n
        for (int i = 1; i <= (int)Math.Sqrt(n); i++)
        {
            if (n % i == 0)
            {
 
                // If divisors are equal,
                // take only one of them
                if (n / i == i)
                {
                    sum = sum + i;
                }
                else // Otherwise take both
                {
                    sum = sum + i;
                    sum = sum + (n / i);
                }
            }
        }
 
        // calculate sum of all
        // proper divisors only
        return sum - n;
    }
 
    // Function to get last number
    // of Aliquot Sequence.
    static int getAliquot(int n)
    {
        HashSet<int> s = new HashSet<int>();
        s.Add(n);
        while (n > 0)
        {
 
            // Calculate next term from previous term
            n = getSum(n);
            if (s.Contains(n))
            {
                return n;
            }
            s.Add(n);
        }
        return 0;
    }
 
    // Returns true if n is perfect
    static bool isPerfect(int n)
    {
        // To store sum of divisors
        int sum = 1;
 
        // Find all divisors and add them
        for (int i = 2; i * i <= n; i++)
        {
            if (n % i == 0)
            {
                sum = sum + i + n / i;
            }
        }
 
        // If sum of divisors is equal to
        // n, then n is a perfect number
        if (sum == n && n != 1)
        {
            return true;
        }
 
        return false;
    }
 
    // Returns true if n is aspiring
    // else returns false
    static bool isAspiring(int n)
    {
         
        // checking condition for aspiring
        int alq = getAliquot(n);
        if (isPerfect(alq) && !isPerfect(n))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        int n = 25;
        if (isAspiring(n))
        {
            Console.WriteLine("Aspiring");
        }
        else
        {
            Console.WriteLine("Not Aspiring");
        }
    }
}
 
// This code is contributed by subhammahato348

Javascript

<script>
// javascript implementation to check whether
// a number is aspiring or not
 
    // Function to calculate sum of
    // all proper divisors
    function getSum(n) {
        var sum = 0; // 1 is a proper divisor
 
        // Note that this loop runs till
        // square root of n
        for (var i = 1; i <= Math.sqrt(n); i++) {
            if (n % i == 0) {
 
                // If divisors are equal,
                // take only one of them
                if (n / i == i) {
                    sum = sum + i;
                } else // Otherwise take both
                {
                    sum = sum + i;
                    sum = sum + (n / i);
                }
            }
        }
 
        // calculate sum of all
        // proper divisors only
        return sum - n;
    }
 
    // Function to get last number
    // of Aliquot Sequence.
    function getAliquot(n) {
        var s = new Set();
        s.add(n);
 
        var next = 0;
        while (n > 0) {
 
            // Calculate next term from previous term
            n = getSum(n);
 
            if (s.has(n) & n != s[s.length-1]) {
                return n;
            }
 
            s.add(n);
        }
        return 0;
    }
 
    // Returns true if n is perfect
    function isPerfect(n) {
        // To store sum of divisors
        var sum = 1;
 
        // Find all divisors and add them
        for (var i = 2; i * i <= n; i++) {
            if (n % i == 0) {
                sum = sum + i + n / i;
            }
        }
 
        // If sum of divisors is equal to
        // n, then n is a perfect number
        if (sum == n && n != 1) {
            return true;
        }
 
        return false;
    }
 
    // Returns true if n is aspiring
    // else returns false
    function isAspiring(n) {
 
        // checking condition for aspiring
        var alq = getAliquot(n);
        if (isPerfect(alq) && !isPerfect(n)) {
            return true;
        } else {
            return false;
        }
    }
 
    // Driver code
     
        var n = 25;
        if (isAspiring(n)) {
            document.write("Aspiring");
        } else {
            document.write("Not Aspiring");
        }
 
// This code is contributed by gauravrajput1
</script>
Producción: 

Aspiring

Complejidad de tiempo: O(n)
 

Publicación traducida automáticamente

Artículo escrito por Prasad_Kshirsagar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *