알고리즘
소인수 분해 문제
path7inder
2014. 9. 24. 18:34
프로그램 명: decomp(open)
제한시간: 1 초
자연수 n 이 입력으로 주어진다. 이 수를 소인수 분해하는 프로그램을 작성하시오.
입력
n 은 2 이상 1 000 000 000 이하의 자연수이다.
출력
소인수를 크기 순으로 공백을 사이에 두고 한 줄에 출력한다.
입출력 예
입력 20 출력 2 2 5 입력 7 출력 7
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 #include <iostream>#include <math.h>#define MAX 10000000using namespace std;int index[MAX];bool isPrime(long long num) // 소수 판변 함수{for(int i=2; i <= sqrt(double(num)); i++){if(index[i]) continue;else if(num % i == 0) return false;}return true;}void func(long long num){for(long long i=2; i<=num; i++){if(i < MAX) { // 천만까지는 체로 걸러냅니다.if(index[i]) continue;}else{if(isPrime(num)){ // 그 이상은 소수 판별을 따로 합니다cout << num << ' ';break;}if(!isPrime(i)) continue;}while(num % i == 0){cout << i << ' ';num /= i;}}cout << endl;}void preProc() // 에라토스테네스의 체를 구합니다.{for(long long i=2; i<MAX; i++){if(index[i]) continue;long long cur = 2;while((cur * i) < MAX)index[(cur++) * i] = 1;}}int main(){long long n;preProc();cin >> n;func(n);}
조금 어거지로 푼거 같아 좀 찝찝합니다. 4단계 문제인데 에라토스 테네스가 필요할까요...