这是华为机试的一道题,题目叫做“质数因子”:

输入一个正整数,按照从小到大的顺序输出它所有的质因子(重复的也要列举)。如 180 的质因子为 2, 2, 3, 3, 5。

我们首先来介绍一下什么是“质数”。数字分为质数和合数。质数也叫素数,它只可以被 1 和它本身整除。除质数以外 的数就叫做合数。最小的质数是 2 。

一个合数一定可以由若干个质数相乘得到。这些质数就是这个合数的“质数因子”。求解一个合数 n 的“质因子”的方法如下:

1. 我们定义 k 等于最小质数 2,如果 n == k,那么将 n 输出,程序结束
2. 如果 n 可以被 k 整除,则应该打印 k 的值,并让 n = n / k
3. 如果 n 不可以被 k 整除,则 k = k + 1
4. 如果 k 小于等于根号 n,那么重复第二步

根据上述方法写出的代码如下:

#include <stdio.h>

int main()
{
    int i, n;

    scanf("%d", &n);
    for (i = 2; i * i <= n; ++i) {
        while (n % i == 0) {
            printf("%d ", i); /* print prime factor of n */
            n /= i;
        }
    }
    if (n > 1) {
        /* n is the last prime factor */
        printf("%d ", n);
    }
    printf("\n");
    return 0;
}

以上。