📜  使用N查找N2的所有除数

📅  最后修改于: 2021-05-17 19:12:05             🧑  作者: Mango

给定数字N ,任务是打印N 2的所有不同的约数。
例子:

天真的方法:
使用sqrt(N)方法查找自然数的所有除数。但是此解决方案效率不高,因为时间复杂度为O(N)
高效方法:

  • 我们尝试使用sqrt(N)方法从N的除数生成N 2的除数。作为,

例如:如果N = 4,要生成4 2 = 16的除数,我们首先要计算4 = 1、2、4的除数。现在,我们将迭代生成的除数,以计算4 2的除数1, 2、4、8和16
下面是上述方法的实现。

C++
// C++ code to print all
// divisors of N*N using N
 
#include 
using namespace std;
 
// Function to find Divisor of N
void DivisorOfN(vector& v,
                map& marked,
                int n)
{
    // sqrt(N) approach
    // to find divisors of N
    for (int i = 1; i <= sqrt(n); i++) {
 
        if (n % i == 0) {
            if (n / i == i) {
                v.push_back(i);
                marked[i] = true;
            }
            else {
                v.push_back(i);
                v.push_back(n / i);
                marked[i] = true;
                marked[n / i] = true;
            }
        }
    }
}
 
// Function to print all divisor of N*N
void PrintDivisors(int n)
{
    // Vector v to store divisors of n
    vector v;
 
    // Map to avoid repeated divisors
    map marked;
 
    // Store all divisor of n
    DivisorOfN(v, marked, n);
 
    int size = v.size();
 
    // Iterating over vector v
    // to generate divisors of N*N
    for (int i = 0; i < size; i++) {
        for (int j = i; j < size; j++) {
            int check = v[i] * v[j];
 
            // Checking if element is
            // already present
            if (marked[check] != true) {
                v.push_back(v[i] * v[j]);
 
                // marking element true
                // after adding in vector
                marked[v[i] * v[j]] = true;
            }
        }
    }
 
    sort(v.begin(), v.end());
 
    printf("Divisors of %d are: ", n * n);
    for (int i = 0; i < v.size(); i++) {
        printf("%d ", v[i]);
    }
    printf("\n");
}
 
// Driver Code
int main()
{
    PrintDivisors(4);
    PrintDivisors(8);
    PrintDivisors(10);
 
    return 0;
}


Java
// Java code to print all
// divisors of N*N using N
import java.util.*;
class GFG
{
 
  // Vector v to store divisors of n
  static  List v = new ArrayList<>();
 
  // Map to avoid repeated divisors
  static HashMap marked = new HashMap<>();
 
  // Function to find Divisor of N
  static void DivisorOfN(int n)
  {
 
    // sqrt(N) approach
    // to find divisors of N
    for (int i = 1; i <= Math.sqrt(n); i++)
    {
 
      if (n % i == 0)
      {
        if (n / i == i)
        {
          v.add(i);
          marked.put(i, true);
        }
        else
        {
          v.add(i);
          v.add(n / i);
          marked.put(i, true); 
          marked.put(n / i, true);
        }
      }
    }
  }
 
  // Function to print all divisor of N*N
  static void PrintDivisors(int n)
  {
 
    // Store all divisor of n
    DivisorOfN(n);
    int size = v.size();
 
    // Iterating over vector v
    // to generate divisors of N*N
    for (int i = 0; i < size; i++)
    {
      for (int j = i; j < size; j++)
      {
        int check = v.get(i) * v.get(j);
 
        // Checking if element is
        // already present
        if (!marked.containsKey(check))
        {
          v.add(v.get(i) * v.get(j));
 
          // marking element true
          // after adding in vector
          marked.put(v.get(i) * v.get(j), true);
        }
      }
    }
 
    Collections.sort(v);      
    System.out.print("Divisors of " + n * n + " are: ");
    for (int i = 0; i < v.size(); i++)
    {
      System.out.print(v.get(i) + " ");
    }
    System.out.println();
    v.clear();
    marked.clear();
  }
 
  // Driver code
  public static void main(String[] args)
  {
    PrintDivisors(4);
    PrintDivisors(8);
    PrintDivisors(10);
  }
}
 
// This code is contributed by divyeshrabadiya07


Python3
# Python3 code to print all
# divisors of N*N using
from math import sqrt
 
# Function to find Divisor of N
def DivisorOfN(v, marked, n):
    # sqrt(N) approach
    # to find divisors of N
    for i in range(1,int(sqrt(n)) + 1, 1):
        if (n % i == 0):
            if (n // i == i):
                v.append(i)
                marked[i] = True
            else:
                v.append(i)
                v.append(n // i)
                marked[i] = True
                marked[n // i] = True
 
# Function to print all divisor of N*N
def PrintDivisors(n):
    # Vector v to store divisors of n
    v = []
 
    # Map to avoid repeated divisors
    marked = {i:False for i in range(1000)}
 
    # Store all divisor of n
    DivisorOfN(v, marked, n)
 
    size = len(v)
 
    # Iterating over vector v
    # to generate divisors of N*N
    for i in range(size):
        for j in range(i,size,1):
            check = v[i] * v[j]
 
            # Checking if element is
            # already present
            if (marked[check] != True):
                v.append(v[i] * v[j])
 
                # marking element true
                # after adding in vector
                marked[v[i] * v[j]] = True
 
    v.sort(reverse = False)
 
    print("Divisors of",n * n,"are: ",end = "")
    for i in range(len(v)):
        print(v[i],end = " ")
     
    print("\n",end = "")
 
# Driver Code
if __name__ == '__main__':
    PrintDivisors(4)
    PrintDivisors(8)
    PrintDivisors(10)
 
# This code is contributed by Bhupendra_Singh


C#
// C# code to print all
// divisors of N*N using N
using System;
using System.Collections.Generic;
class GFG {
     
    // Vector v to store divisors of n
    static List v = new List();
   
    // Map to avoid repeated divisors
    static Dictionary marked = new Dictionary();
     
    // Function to find Divisor of N
    static void DivisorOfN(int n)
    {
        // sqrt(N) approach
        // to find divisors of N
        for (int i = 1; i <= Math.Sqrt(n); i++)
        {
       
            if (n % i == 0)
            {
                if (n / i == i)
                {
                    v.Add(i);
                    marked[i] = true;
                }
                else
                {
                    v.Add(i);
                    v.Add(n / i);
                    marked[i] = true;
                    marked[n / i] = true;
                }
            }
        }
    }
 
    // Function to print all divisor of N*N
    static void PrintDivisors(int n)
    {
         
        // Store all divisor of n
        DivisorOfN(n);
       
        int size = v.Count;
       
        // Iterating over vector v
        // to generate divisors of N*N
        for (int i = 0; i < size; i++)
        {
            for (int j = i; j < size; j++)
            {
                int check = v[i] * v[j];
       
                // Checking if element is
                // already present
                if (!marked.ContainsKey(check))
                {
                    v.Add(v[i] * v[j]);
       
                    // marking element true
                    // after adding in vector
                    marked[v[i] * v[j]] = true;
                }
            }
        }
       
        v.Sort();
       
        Console.Write("Divisors of " + n * n + " are: ");
        for (int i = 0; i < v.Count; i++)
        {
            Console.Write(v[i] + " ");
        }
        Console.WriteLine();
         
        v.Clear();
        marked.Clear();
    }
 
  // Driver code
  static void Main()
  {
    PrintDivisors(4);
    PrintDivisors(8);
    PrintDivisors(10);
  }
}
 
// This code is contributed by divyesh072019


输出:
Divisors of 16 are: 1 2 4 8 16 
Divisors of 64 are: 1 2 4 8 16 32 64 
Divisors of 100 are: 1 2 4 5 10 20 25 50 100

时间复杂度: O(sqrt(N)+ a 2 )其中,a是N的除数。
注意:此方法与“查找自然数的所有除数”有何不同?
令N = 5,因此我们需要找到所有25的除数。

  • 使用“查找自然数的所有除数”中使用的方法我们将使用i从1迭代到sqrt(25)= 5并检查i和n / i。
    时间复杂度: O(sqrt(25))
  • 使用本文中使用的方法:通过使用上述文章方法,我们将找到5的除数,该方法将以sqrt(5)时间复杂度完成。现在,对于所有的5除数,即1、5,我们将其存储在数组中,并借助2个循环{(1 * 1,1 * 5,5 * 1,5 * 5)}成对相乘,然后选择唯一1、5、25。这将花费a ^ 2的时间(其中a是5的除数的个数,这里是2)
    时间复杂度: O(sqrt(5)+ 2 ^ 2)

    当数量的除数较少时,本文只会比上述文章更好。