簡體   English   中英

改進/修復質因數分解函數

[英]Improve/fix prime factorization function

我有一個函數質因數分解,但它的工作很奇怪,我不知道如何使它正確。 如果 2's 或 3's 是重復因子,則預計通過 'x' 打印因子並寫成 2^(power) 或 3^(power)。

我的輸出:2 >> 22^2 | 6 >> 2 x 3^2 | 8 >> 22^22^3 | 9 >> 3 x 3^2。
如何更改此代碼以使其正常工作。

注意:我在 main() 中說過如果 num == 1: 打印 1。

void prime_factors(int num)
{
    int power = 0;

    for (int factor = 2; num > 1; ++factor)
    {
        while (num % factor == 0)
        {
            if (factor >= 3 && power >= 1)
                printf(" x %d", factor);
            else
                printf("%d", factor);
            num /= factor;
            ++power;
            if (power >= 1)
            {
                printf("^%d", power);
            }
        }
    }
}

有四個問題:

  1. 每個因素的power不會重置為 0
  2. 即使power為0,它也是打印factor
  3. 它不應該打印的factorpower ,直到power已經完全確定。 (目前,每次增加power都會打印代碼。
  4. 如果第一個因子 > 2,它會在開頭打印x

固定版本如下:

void prime_factors(int num)
{
    int power = 0;
    int first = 1;

    for (int factor = 2; num > 1; ++factor)
    {
        power = 0;
        while (num % factor == 0)
        {
            num /= factor;
            ++power;
        }
        if (power >= 1)
        {
            if (first)
                printf("%d", factor);
            else
                printf(" x %d", factor);
            printf("^%d", power);
            first = 0;
        }
    }
}

有多種方法可以加快速度。

加快速度的一種方法是在因子變得太大時跳過因子(大於num平方根,正如@chux在評論中所建議的那樣),將num作為唯一剩余的因子。 可以使用簡單的除法而不是計算平方根,如下面的// speed up 1代碼部分所示:

void prime_factors(int num)
{
    int power = 0;
    int first = 1;

    for (int factor = 2; num > 1; ++factor)
    {
        power = 0;
        // speed up 1
        if (num / factor < factor)
        {
            // skip impossible factors
            factor = num;
        }
        // end of speed up 1
        while (num % factor == 0)
        {
            num /= factor;
            ++power;
        }
        if (power >= 1)
        {
            if (first)
                printf("%d", factor);
            else
                printf(" x %d", factor);
            printf("^%d", power);
            first = 0;
        }
    }
}

另一種加快速度的方法是在大多數情況下在for循環中將factor增加 2,除非factor為 2,因此序列將是 2、3、5、7、9、11 等:

    for (int factor = 2; num > 1; factor += 1 + (factor & 1))

factor += 1 + (factor & 1)的增量factor 1時factor為偶數時,和增量factor由2時factor是奇數,所以唯一的偶數值factor將所述初始值2。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM