查找给定数字的所有素数因子

时间:2016-10-26 22:23:54

标签: c prime-factoring

我想找到all prime factors of a number,例如8: 2 2 212: 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,它只打印多次这个因素。

3 个答案:

答案 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))