给定数字N ,任务是打印N 2的所有不同的约数。
例子:
Input: N = 4
Output: 1 2 4 8 16
Explanation:
N = 4, N2 = 16
Divisors of 16 are: 1 2 4 8 16
Input: N = 8
Output: 1 2 4 8 16 32 64
天真的方法:
使用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)当数量的除数较少时,本文只会比上述文章更好。