OCAC暑期比赛第一场 M题 因式分解 题解

因式分解
【题目描述】
给你一个int范围内的正整数,请你对其进行因式分解。
所谓因式分解,就是将一个数转换成若干个素数的成绩的形式。
比如:
对于整数12,它可以分解成 2 x 2 x 3 的形式。所以对 12 进行因式分解的结果就是 "2 2 3";
对于整数30,它可以分解成 2 x 3 x 5 的形式。所以对 30 进行因式分解的结果就是 "2 3 5“;
杜宇整数31,因为它本身就是一个素数,所以对 31 进行因式分解的结果就是 "31" 本身。
在这道题目里面,我们要求对因式分解的结果中的每一个因数都是素数,并且按照非递减的顺序在一行中输出,每两个因数中间有一个空格分隔。
【输入格式】
输入包含一个整数 a (2<=a<2^31)。
【输出格式】
输出饮食分解的结果。即将 a 分成的所有因数的一个排列。并且排列中的元素按照非递减的顺序排在一行,两个引述之间有一个空格分隔。
【样例输入1】
12
【样例输出1】
2 2 3
【样例输入2】
30
【样例输出2】
2 3 5
【题目分析】
因式分解模板题。对于一个数 a ,我们只要从 2 开始枚举每一个数 i ,
如果 i 不能整除 a ,则 i++;
如果 i 能够整数 a ,则得到一个因数 i ,并且 a 本身除去 i。
如此进行知道 n 变成 1 为止。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int a, ans[110], cnt;

int main() {
    scanf("%d", &a);
    for (int i = 2; i *i <= a; i ++) {
        while (a % i == 0) {
            a /= i;
            ans[cnt++] = i;
        }
    }
    if (a > 1) ans[cnt++] = a;
    for (int i = 0; i < cnt; i ++) {
        if (i) putchar(' ');
        printf("%d", ans[i]);
    }
    putchar('\n');
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ocac/p/11113464.html