一、题目大意
- PAT A1059
- 就是给出一个不超过 int 大小的数,分解质因数。
二、解题思路
- 首先筛法打表计算
(46341) 内的素数,这里为了方便取了 50000。因为对一个数 n 分解质因数时,若它在 1~
内没有质因数,则这个数一定为素数。 - 对给定的数 n 进行分解,对于某个质因数,分解的同时记录其个数,然后输出。当给定的数变成 1 或是遍历完 1~
内的素数时 ,分解完成。若分解完成时 n 不为 1 ,说明这个数没有被分解,这个数一定为素数,直接输出即可。 - 对于 n = 1 的这种情况要进行特判。
三、参考代码
#include<iostream>
#include<math.h>
const int maxn = 50000;
using namespace std;
int p[maxn];
void cal() {
fill(p, p + maxn, 1);
p[0] = p[1] = 0;
for (int i = 2; i < maxn; i++) {
if (p[i])
for (int j = 2 * i; j < maxn; j += i)
p[j] = 0;
}
}
void solve(int n) {
cout << n << '=';
int s = (int)sqrt(n);
for (int i = 2; i <= s; i++) {
if (p[i] && n % i == 0) {
int cnt = 0;
while (n % i == 0) {
n /= i;
cnt++;
}
cout << i;
if (cnt > 1) cout << '^' << cnt;
if (n != 1) cout << '*';
if (n == 1) break;
}
}
if (n > 1) cout << n;
cout << endl;
}
int main() {
cal();
int n;
cin >> n;
if (n == 1) cout << "1=1" << endl;
else solve(n);
return 0;
}
四、解题感悟
- 越来越觉得,正确的解题方法一般都是很简洁并且很容易理解的。如果写的代码非常复杂,考虑了很多情况之后,还是漏洞百出,就应当考虑是否想偏了,是否可以换个角度思考。