我想找到all prime factors of a number,例如8: 2 2 2
或12: 2 2 3
。
所以我写这段代码:
#include <stdio.h>
int main() {
int a, triangularNum, n;
scanf("%d", &triangularNum);
for (a = 2; a <= n; ++a) {
while (n % a == 0) {
n = triangularNum;
printf("%d\t", a);
n = n / a;
}
}
}
但是当它有一个有权力的因素&gt; 1,它只打印多次这个因素。
答案 0 :(得分:4)
如果您删除此triangularNum
:
#include <stdio.h>
int main()
{
int a, n;
scanf("%d", &n);
for (a=2; a<=n; ++a)
{
while(n%a==0)
{
printf("%d\t", a);
n = n/a;
}
}
}
答案 1 :(得分:0)
下面的代码可以更快地找到给定数量的所有素数。
#include <stdio.h>
#include <math.h>
int main()
{
int a, n;
scanf("%d", &n);
int sqroot = (int)sqrt(n);
while (n % 2 == 0)
{
n = n / 2;
printf("%d\t", 2);
}
for (a=3; a<=sqroot; a+=2)
{
while(n%a==0)
{
printf("%d\t", a);
n = n/a;
}
}
}
检查给定整数n的素数的最基本方法称为试验除法。此方法将n除以2到n的平方根的每个整数。任何将n均等的整数均将n设为复合数;否则,它是主要的。不需要检查大于平方根的整数,因为每当n = a⋅b时,两个因子a和b之一都小于或等于n的平方根。另一个优化是仅检查素数作为该范围内的因子。 https://en.wikipedia.org/wiki/Prime_number
答案 2 :(得分:0)
void factor(int n){
if(n<=1) return;
while(n%2==0){
printf("2 ");
n=n/2;
}
while(n%3==0){
printf("3 ");
n=n/3;
}
for(int i=5;i*i<=n;i=i+6){
while(n%i==0){
printf("%d\t",i);
n=n/i;
}
while(n%(i+2)==0){
printf("%d\t",(i+2));
n=n/(i+2);
}
}
if(n>3)
printf("%d\t",n);
}
最坏情况时间复杂度:O(sqrt(n))