PAT 分解因數 (模擬) 詳細題解
阿新 • • 發佈:2018-11-19
篩法求素數 + 遍歷即可
//分解因數 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <vector> #include <queue> #include <cmath> using namespace std; #define ms(x, n) memset(x,n,sizeof(x)); typedef long long LL; const LL maxn = 1e6+5; int primeNum[maxn]; bool isPrime[maxn]; void getPrime(int n) { //篩法求得n以內的所有素數並儲存在primeNum中 for(int i = 2; i <= n; i++) isPrime[i] = 1; for(int i = 2; i <= n; i++){ if(isPrime[i]) for(int j = 2; i*j <= n; j++) isPrime[i*j] = 0; } for(int i = 2, j = 1; i <= n; i++) if(isPrime[i]) primeNum[j++] = i; } void solve(int n) { //每次求得並輸出n的最小質因子 if(n == 1) return; for(int i = 1; primeNum[i] <= n; i++) if(n % primeNum[i] == 0){ n /= primeNum[i]; if(n == 1) printf(" %d", primeNum[i]); else printf(" %d *", primeNum[i]); break; } solve(n); } int main() { getPrime(maxn); int n; while(cin >> n){ printf("%d =",n); solve(n); printf("\n"); } return 0; }