在 C 中打印数字的质因数

Printing prime factors of numbers in C

代码适合第一个数字并不断打印。我该如何解决这个问题?

int count = 0;
for (int i = 0; i <= 20; i++) {
    for (count = 2; i > 1; count++) {
        while (i % count == 0) {
            printf("%d ", count);
            i = i / count;
        }
    }
}

每次迭代中的值如下。

  1. count = 0; i = 0;不输入第二个for.
  2. count = 0; i = 1;不输入第二个for.
  3. count = 0; i = 2;输入第二个forcount = 2;
  4. 2 % 2 == 0 - 输入 while.
  5. i = 2 / 2; 1 % 2 == 1; 不输入 while.
  6. 回到第二个for - count = 3;,i = 1;不进入第二个for
  7. 回到第一个-i < 20;,所以i = 2.
  8. count = 2; i = 2; 我们回到第 4 步,无限循环。

这可能就是您要找的 -

int j, count = 0;
for (int i = 20; i > 0; i--)
{
    printf("\n%d: ", i);
    for(count = 2, j = i; j > 1; count++)
    {  
        while(j % count == 0)
        {
            printf("%d ", count);
            j = j / count;
        }  
    } 
}

定义一个函数来检查给定数字 n 是否为质数:

bool is_prime(int n)
{
    if (n < 2) return false;
    for (int i = 2; i <= n/i; ++i) // Doing i*i<=n may overflow
        if (n % i == 0) return false;
    return true;
}

然后这样称呼它:

for (int i = 0; i <= 20; i++)
    if(is_prime(i))
        printf("%d\n", i);

或更直接(即没有函数):

int main(void)
{
    int mark;
    for (int n = 2; n <= 20; n++) {
        mark = 1;
        
        for (int i = 2; i*i <= n; ++i)
            if (n % i == 0) mark = 0;
        
        if (mark) printf("%d\n", n);
    }
}