给定数字n,找到有序素数签名,并使用该函数找到给定n的除数。
任何正整数’n’都可以以其主要因子的形式表示。如果’n’具有p 1 ,p 2 ,…等作为其主要因子,则n可以表示为:
现在,以非降序排列获得的“ n”素数的指数。这样获得的排列称为正整数“ n”的有序素数签名。
例子:
Input : n = 20
Output :
The Ordered Prime Signature of 20 is :
{ 1, 2 }
The total number of divisors of 20 is 6
Input : n = 13
Output :
The Ordered Prime Signature of 13 is :
{ 1 }
The total number of divisors of 13 is 2
解释 :
20的有序素数签名= {1,2}
37的有序素数签名= {1}
有序素数49 = {2}
从上面的讨论可以确定1的素数是{1}。此外,所有素数都具有相同的签名,即{1}和一个数字的素数签名,即素数的k次幂(例如25,即5的2次幂)。 {k}。
例如 :
Ordered Prime signature of 100 = { 2, 2 }, as 100 = 2^2 × 5^2
Now adding one to each element gives { 3, 3 } and the product is 3 × 3 = 9,
i.e the total number of divisors of 100 is nine.
They are 1, 2, 4, 5, 10, 20, 25, 50, 100.
方法 :
1)找到数字的素因式分解
2)将与质因子相对应的每个指数存储在向量中
3)按升序对向量进行排序
4)向向量中存在的每个元素添加一个
5)将所有元素相乘
C++
// CPP to find total number of divisors of a
// number, using ordered prime signature
#include
using namespace std;
// Finding primes upto entered number
vector primes(int n)
{
bool prime[n + 1];
// Finding primes by Sieve
// of Eratosthenes method
memset(prime, true, sizeof(prime));
for (int i = 2; i * i <= n; i++)
{
// If prime[i] is not changed,
// then it is prime
if (prime[i] == true) {
// Update all multiples of p
for (int j = i * 2; j <= n; j += i)
prime[j] = false;
}
}
vector arr;
// Forming array of the prime numbers found
for (int i = 2; i <= n; i++)
{
if (prime[i])
arr.push_back(i);
}
return arr;
}
// Finding ordered prime signature of the number
vector signature( int n)
{
vector r = primes(n);
// Map to store prime factors and
// the related exponents
map factor;
// Declaring an iterator for map
map::iterator it;
vector sort_exp;
int k, t = n;
it = factor.begin();
// Finding prime factorization of the number
for (int i = 0; i < r.size(); i++)
{
if (n % r[i] == 0) {
k = 0;
while (n % r[i] == 0) {
n = n / r[i];
k++;
}
// Storing the prime factor and
// its exponent in map
factor.insert(it, pair(r[i], k));
// Storing the exponent in a vector
sort_exp.push_back(k);
}
}
// Sorting the stored exponents
sort(sort_exp.begin(), sort_exp.end());
// Printing the prime signature
cout << " The Ordered Prime Signature of " <<
t << " is : \n{ ";
for (int i = 0; i < sort_exp.size(); i++)
{
if (i != sort_exp.size() - 1)
cout << sort_exp[i] << ", ";
else
cout << sort_exp[i] << " }\n";
}
return sort_exp;
}
// Finding total number of divisors of the number
void divisors(int n)
{
int f = 1, l;
vector div = signature(n);
l = div.size();
// Adding one to each element present
for (int i = 0; i < l; i++)
{
// in ordered prime signature
div[i] += 1;
// Multiplying the elements
f *= div[i];
}
cout << "The total number of divisors of " <<
n << " is " << f << "\n";
}
// Driver Method
int main()
{
int n = 13;
divisors(n);
return 0;
}
Java
// JAVA to find total number of divisors of a
// number, using ordered prime signature
import java.util.*;
class GFG
{
static class pair
{
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Finding primes upto entered number
static Vector primes(int n)
{
boolean []prime = new boolean[n + 1];
// Finding primes by Sieve
// of Eratosthenes method
Arrays.fill(prime, true);
for (int i = 2; i * i <= n; i++)
{
// If prime[i] is not changed,
// then it is prime
if (prime[i] == true) {
// Update all multiples of p
for (int j = i * 2; j <= n; j += i)
prime[j] = false;
}
}
Vector arr = new Vector<>();
// Forming array of the prime numbers found
for (int i = 2; i <= n; i++)
{
if (prime[i])
arr.add(i);
}
return arr;
}
// Finding ordered prime signature of the number
static Vector signature( int n)
{
Vector r = primes(n);
// Map to store prime factors and
// the related exponents
HashMap factor = new HashMap<>();
// Declaring an iterator for map
// HashMap::iterator it;
Vector sort_exp = new Vector<>();
int k, t = n;
int it = 0;
// Finding prime factorization of the number
for (int i = 0; i < r.size(); i++)
{
if (n % r.get(i) == 0)
{
k = 0;
while (n % r.get(i) == 0)
{
n = n / r.get(i);
k++;
}
// Storing the prime factor and
// its exponent in map
factor.put(r.get(i), k);
// Storing the exponent in a vector
sort_exp.add(k);
}
}
// Sorting the stored exponents
Collections.sort(sort_exp);
// Printing the prime signature
System.out.print(" The Ordered Prime Signature of " +
t+ " is : \n{ ");
for (int i = 0; i < sort_exp.size(); i++)
{
if (i != sort_exp.size() - 1)
System.out.print(sort_exp.get(i) + ", ");
else
System.out.print(sort_exp.get(i) + " }\n");
}
return sort_exp;
}
// Finding total number of divisors of the number
static void divisors(int n)
{
int f = 1, l;
Vector div = signature(n);
l = div.size();
// Adding one to each element present
for (int i = 0; i < l; i++)
{
// in ordered prime signature
//div[i] += 1;
// Multiplying the elements
f *= (div.get(i) + 1);
}
System.out.print("The total number of divisors of " +
n + " is " + f + "\n");
}
// Driver code
public static void main(String[] args)
{
int n = 13;
divisors(n);
}
}
// This code is contributed by aashish1995
C#
// C# to find total number
// of divisors of a number,
// using ordered prime signature
using System;
using System.Collections.Generic;
class GFG
{
// Finding primes
// upto entered number
static List primes(int n)
{
bool []prime = new bool[n + 1];
// Finding primes by Sieve
// of Eratosthenes method
for (int i = 0; i < n + 1; i++)
prime[i] = true;
for (int i = 2; i * i <= n; i++)
{
// If prime[i] is not
// changed, then it is prime
if (prime[i] == true)
{
// Update all multiples of p
for (int j = i * 2;
j <= n; j += i)
prime[j] = false;
}
}
List arr = new List();
// Forming array of the
// prime numbers found
for (int i = 2; i <= n; i++)
{
if (prime[i])
arr.Add(i);
}
return arr;
}
// Finding ordered prime
// signature of the number
static List signature( int n)
{
List r = primes(n);
// Map to store prime factors
// and the related exponents
var factor = new Dictionary();
List sort_exp = new List();
int k, t = n;
// Finding prime factorization
// of the number
for (int i = 0; i < r.Count; i++)
{
if (n % r[i] == 0)
{
k = 0;
while (n % r[i] == 0)
{
n = n / r[i];
k++;
}
// Storing the prime factor
// and its exponent in map
factor.Add(r[i], k);
// Storing the exponent
// in a List
sort_exp.Add(k);
}
}
// Sorting the
// stored exponents
sort_exp.Sort();
// Printing the
// prime signature
Console.Write(" The Ordered Prime Signature of " +
t + " is : \n{ ");
for (int i = 0; i < sort_exp.Count; i++)
{
if (i != sort_exp.Count - 1)
Console.Write(sort_exp[i] + ", ");
else
Console.Write(sort_exp[i] + " }\n");
}
return sort_exp;
}
// Finding total number
// of divisors of the number
static void divisors(int n)
{
int f = 1, l;
List div = signature(n);
l = div.Count;
// Adding one to each
// element present
for (int i = 0; i < l; i++)
{
// in ordered
// prime signature
div[i] += 1;
// Multiplying
// the elements
f *= div[i];
}
Console.Write("The total number of divisors of " +
n + " is " + f + "\n");
}
// Driver Code
static void Main()
{
int n = 13;
divisors(n);
}
}
// This code is contributed by
// Manish Shaw(manishshaw1)
The Ordered Prime Signature of 13 is :
{ 1 }
The total number of divisors of 13 is 2
应用 :
查找数字的有序素数签名可用于查找除数。实际上,可以从该数字的有序素数中推断出一个数字的除数总数。为此,只需在有序素数签名中的每个元素上添加一个,然后将这些元素相乘即可。由此获得的乘积给出了该数目的除数的总数(包括1和该数目本身)。