首先得知道一个数学规律,任何大于一的数都一定能拆分成若干个质数的乘积。所以我们可用从2开始试探,如果能被2整除,就输出2并就一直除,直到无法被2整除,然后换3来试试......,可能有人会有疑问,万一被4整除会不会把4也给输出,其实如果是4的倍数,在前面一直除以2的过程中,已经被分解掉了,后面的同理,因此这样做能保证算法一定是对的。可以直观理解一下,如果要给出证明还是得花费一番功夫的。

于是写出如下超时的代码:

#include <stdio.h>

int main()
{
    long x;

    while (scanf("%ld", &x) != EOF) {
        long i = 2, tmp = x;

        while (i <= x && x != 0) {
            while (x % i == 0) {
                printf("%ld ", i);
                x /= i;
            }
            ++i;
        }
    }

    return 0;
}

再使用一个结论: 的质因子一定 ,因此做出如下优化:

#include <stdio.h>

int main()
{
    long x;

    while (scanf("%ld", &x) != EOF) {
        long i = 2, tmp = x;

        while (i <= x && i * i <= tmp) {
            while (x % i == 0) {
                printf("%ld ", i);
                x /= i;
            }
            ++i;
        }

        if (x != 1) printf("%d ", x);
        putchar('\n');
    }

    return 0;
}

需要注意,修改判断条件后,少了最后一次除法,比如x = 10,先除以2后变成了5,此时i = 3,i * i = 9大于5,再比如当输入的 x = 5 时, 由于5 % 2 != 0,因此 i 变成 3,这时,i的平方比原来最开始的 x 要大了。究其原因,是因为5本身就是个质数,因此尝试去分解它是做不到的,如果是那个超时的写法,这个i是遍历到了5的,所以能输出,但是这里是到根号5,因此无法输出。所以在最后还得加个额外的输出语句,用于输出最大的那个素数因子(1除外)