本文概述
- C/C++
- Java
- python
- C#
- PHP
例子:
例:15的质数因子是3和5(因为3×5=15, 3和5是质数)。
文章图片
关于质数因子的一些有趣的事实:
- 对于任何数量, 只有一组(唯一!)素数因子。
- 为了保持唯一素数分解的这一特性, 必须将数字1既不是素数也不是复合数。
- 素因式分解可以帮助我们进行除数运算, 简化分数并找到分数的公共分母。
- Pollard的Rho是素数分解算法, 对于大型复合数与小的主要因素。
- 密码学是对密码的研究。素数分解对于尝试根据数字创建(或破解)秘密代码的人们非常重要。
天真的解决方案:
给定一个数字n, 编写一个函数打印n的所有素数。例如, 如果输入数字为12,
那么输出应该是" 2 2 3", 如果输入数字是315, 那么输出应该是" 3 3 5 7"。
以下是查找所有主要因素的步骤:
- 当n被2整除时,打印2并将n除以2。。
- 步骤1之后,n必须为奇数。现在开始一个循环,从i = 3到n的平方根。当i除以n时,打印i并将n除以i,将i增加2,然后继续。
- 如果n是一个质数并且大于2,那么n在以上两步之后不会变成1。如果n大于2,输出n。
// Program to print all prime factors
# include <
stdio.h>
# include <
math.h>
// A function to print all prime factors of a given number n
void primeFactors( int n)
{
// Print the number of 2s that divide n
while (n%2 == 0)
{
printf ( "%d " , 2);
n = n/2;
}// n must be odd at this point.So we can skip
// one element (Note i = i +2)
for ( int i = 3;
i <
= sqrt (n);
i = i+2)
{
// While i divides n, print i and divide n
while (n%i == 0)
{
printf ( "%d " , i);
n = n/i;
}
}// This condition is to handle the case when n
// is a prime number greater than 2
if (n >
2)
printf ( "%d " , n);
}/* Driver program to test above function */
int main()
{
int n = 315;
primeFactors(n);
return 0;
}
Java
// Program to print all prime factors
import java.io.*;
import java.lang.Math;
class GFG {
// A function to print all prime factors
// of a given number n
public static void primeFactors( int n)
{
// Print the number of 2s that divide n
while (n % 2 == 0 ) {
System.out.print( 2 + " " );
n /= 2 ;
}// n must be odd at this point.So we can
// skip one element (Note i = i +2)
for ( int i = 3 ;
i <
= Math.sqrt(n);
i += 2 ) {
// While i divides n, print i and divide n
while (n % i == 0 ) {
System.out.print(i + " " );
n /= i;
}
}// This condition is to handle the case whien
// n is a prime number greater than 2
if (n >
2 )
System.out.print(n);
}public static void main(String[] args)
{
int n = 315 ;
primeFactors(n);
}
}
python
# Python program to print prime factorsimport math# A function to print all prime factors of
# a given number n
def primeFactors(n):# Print the number of two's that divide n
while n % 2 = = 0 :
print 2 , n = n / 2# n must be odd at this point
# so a skip of 2 ( i = i + 2) can be used
for i in range ( 3 , int (math.sqrt(n)) + 1 , 2 ):# while i divides n, print i ad divide n
while n % i = = 0 :
print i, n = n / i# Condition if n is a prime
# number greater than 2
if n >
2 :
print n# Driver Program to test above functionn = 315
primeFactors(n)# This code is contributed by Harshit Agrawal
C#
// C# Program to print all prime factors
using System;
namespace prime {
public class GFG {// A function to print all prime
// factors of a given number n
public static void primeFactors( int n)
{
// Print the number of 2s that divide n
while (n % 2 == 0) {
Console.Write(2 + " " );
n /= 2;
}// n must be odd at this point. So we can
// skip one element (Note i = i +2)
for ( int i = 3;
i <
= Math.Sqrt(n);
i += 2) {
// While i divides n, print i and divide n
while (n % i == 0) {
Console.Write(i + " " );
n /= i;
}
}// This condition is to handle the case whien
// n is a prime number greater than 2
if (n >
2)
Console.Write(n);
}// Driver Code
public static void Main()
{
int n = 315;
primeFactors(n);
}
}
}// This code is contributed by Sam007
PHP
<
?php
// PHP Efficient program to print all
// prime factors of a given number// function to print all prime
// factors of a given number n
function primeFactors( $n )
{// Print the number of
// 2s that divide n
while ( $n % 2 == 0)
{
echo 2, " " ;
$n = $n / 2;
}// n must be odd at this
// point. So we can skip
// one element (Note i = i +2)
for ( $i = 3;
$i <
= sqrt( $n );
$i = $i + 2)
{// While i divides n, // print i and divide n
while ( $n % $i == 0)
{
echo $i , " " ;
$n = $n / $i ;
}
}// This condition is to
// handle the case when n
// is a prime number greater
// than 2
if ( $n >
2)
echo $n , " " ;
}// Driver Code
$n = 315;
primeFactors( $n );
// This code is contributed by aj_36
?>
输出如下:
3 3 5 7
这是如何运作的?
步骤1和2处理合数步骤3处理质数。为了证明完整的算法是可行的,我们需要证明步骤1和2实际上是处理合数的。
现在主要的部分是,循环运行到n的平方根。为了证明这个优化是有效的,让我们考虑以下合数的性质。
每个复合数至少具有一个小于或等于其平方根的素数。可以使用计数器语句证明此属性。令a和b为n的两个因数, 使得a * b = n。如果两者均大于√n, 则a.b> √n, *√n, 这与表达式" a * b = n"相矛盾。
在上述算法的第2步中, 我们运行一个循环并执行以下操作-
- 找到最小素数因子i(必须小于√n, )
- 重复将n除以i, 从n中删除所有出现的i。
- 重复步骤a和b, 除以n, i = i +2。重复步骤a和b, 直到n变为1或质数。
- 使用Sieve O(log n)进行质因子分解以进行多个查询
- 阵列产品的主要因素
- 给定数的第N个素数
- 程序可成对打印多个因子
- 前n个自然数的不同质数的数量
- 许多唯一素数的乘积
- 计算主要因子仅为2和3的范围中的数字
- 两个数的共同素数
- 直到n的数字的最小素因数
- 数的最小除数
- 使用素数分解的数的因子之和
- 数字和等于其所有素数的数字之和的数字
- 具有最大素数在M到N范围内的数字
推荐阅读
- jQuery如何使用event.currentTarget属性(用法示例)
- Django基础(快速入门项目示例)
- 使用O(n)时间的栈的滑动窗口最大值(大小为k的所有子数组的最大值)
- 如何解决骑士旅行问题(|回溯算法设计1)
- 硬币袋问题介绍和解决方法
- 如何使用OpenCV过滤颜色(代码示例)
- 分割字符串的方法,使每个分区以不同的字符开始
- 计算从一个字符串转为另一个字符串的最小编辑次数| DP-5
- Python编程(计算三个数最大值的3中方法)