用于寻找素因子的C程序,编译并未停止

时间:2016-04-22 16:20:12

标签: c prime-factoring

计算最大素数因子600851475143的程序在编译和执行期间卡住并且永不停止。有谁知道为什么它没有完成执行?

#include <stdio.h> //Edited the #includes(typo) to #include 
 int main (void)
{

    long long int num = 600851475143 ;
    long long int factorCount;
    long long int bigFactor;

    for ( long long int i=1 ; i <= num; i+=2 )// Iterating through all numbers from 2, smaller than or equal to num
    {
        if ( num % i == 0) // If the number "i" is a factor of num i.e. If "i" perfectly divides num
        {
            factorCount = 0;
            //checking whether a factor "i" , is a prime factor of num
            for ( long long int j=2; j <= i ; j++  ) // Iterating through all numbers from 2, smaller than or equal to "i"
            {
                if ( i % j == 0) // If the number "j" prefectly divides or is a factor of "i"
                {
                    factorCount++; //Add 1 to factorCount
                };
            };

            if ( factorCount == 1 ) // If factorCount has not exceeded 1 i.e., the number "i" is a prime number
            {
                bigFactor = i;
            };
        };

    };
    printf("The largets prime factor of %lli is %lli\n",num,bigFactor );

    return 0;
}

6 个答案:

答案 0 :(得分:1)

它完成了它的执行,它只需要很多时间。 您正在执行循环600851475143/2次或大约3000亿次。如果主循环执行需要1ms(但是由于还有另一个内循环需要更多),那么这意味着所需的时间大约为9。5年。

请耐心等待,你的循环将完成。

答案 1 :(得分:1)

我不确定我是否理解你的问题..所以你只想获得一定数量的最大素数?如果是这种情况,那么只需执行以下操作:

#include <stdio.h>

#define NUMBER 600851475143

int main (void)
{
    long long int num = NUMBER;
    long long int factor;

    for (factor=2 ; num != 1; factor++) {
        if (num % factor == 0) {
            num = num / factor;
            factor = factor-1;
        }
    }
    printf("The largets prime factor of %lli is %lli\n",NUMBER, factor);
    return 0;
}

为什么会这样:你找到的第一个主要因素是数字的最小素数因子;最后一个主要因素是最大的。因此,一旦找到素数因子p,就不存在小于p的素因子,因为否则你会发现之前的较小素数因子。因此,你的下一个主要因素是更大的等于p。

答案 2 :(得分:0)

试试这个:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 int main (void)
{

    long long int num = 600851475143 ;
    long long int factorCount;
    long long int bigFactor;
    for ( long long int i=1 ; i <= sqrt(num); i+=2 )// Iterating through all numbers from 2, smaller than or equal to num
    {
        if ( num % i == 0) // If the number "i" is a factor of num i.e. If "i" perfectly divides num
        {
            factorCount = 0;
            //checking whether a factor "i" , is a prime factor of num
            for ( long long int j=2; j <= i ; j++  ) // Iterating through all numbers from 2, smaller than or equal to "i"
            {
                if ( i % j == 0) // If the number "j" prefectly divides or is a factor of "i"
                {
                    factorCount++; //Add 1 to factorCount
                };
            };

            if ( factorCount == 1 ) // If factorCount has not exceeded 1 i.e., the number "i" is a prime number
            {
                bigFactor = i;
            };
        };

    };
    printf("The largets prime factor of %lli is %lli\n",num,bigFactor );

    return 0;
}

仅计算600851475143的根。

答案 3 :(得分:0)

嗯,我最好的猜测是它运行得非常好,但需要花费太多时间。 所以你要做的就是优化你的算法。 以下是一些改进算法的提示:

  • 你只需要迭代直到数字的平方根来知道它是否是素数。
  • 正如你在我们的外循环中所做的那样(但不是在你的内循环中),你只需要遍历奇数。
  • 既然你正在寻找最高的素数因子,那么从最后开始尝试,一旦你达到一个黄金因素,就停止寻找。

我认为这应该在合理的时间内运行。

编辑:实际上,在反思之后,第三点并不那么明显。当然,它比通过所有因素更好,但对于大因子而言计算速度较慢......

答案 4 :(得分:0)

下午24点,

此代码的运行时间将非常长,非常长。但它应该工作,只有真正的错误是

中的's'
#includes <stdio.h> 

所以请耐心等待,你处理的是非常大的数字,通过奇数进行迭代使得它的长度远远小于它可能的长度,不要

注意:如果您使用的是在线IDE,例如cpp.sh或其他来源,该网站很可能会超时。请使用本地安装的IDE。

答案 5 :(得分:0)

这非常有效:

#include <stdio.h>

#define NUMBER 600851475143

static unsigned long long int gpf(unsigned long long n)
{
    unsigned long long d, q;

    while (n > 2 && !(n & 1))
        n >>= 1;

    d = 3;
    while (d * d <= n) {
        q = n / d;
        if (q * d == n)
            n = q;
        else
            d += 2;
    }

    return n;
}

int main(void)
{
    printf("The largest prime factor of %llu is %llu\n",
           NUMBER, gpf(NUMBER));
    return 0;
}