소인수 분해 알고리즘 작성해봤는데 피드백 부탁드립니다. alghost #define _CRT_SECURE_NO_WARNINGS #include<cstdio> #include<list> #include<tuple> using namespace std; //소인수 분해 알고리즘 입력이 48이라면 2 2 2 2 3 으로 저장 list<int> factorization(int n) { if (n <= 1) return list<int>(1, 1); list<int> tmp; for (int div = 2; n > 1; div++) { if (n % div == 0) { n /= div; tmp.push_back(div); div--; } } return tmp; } int main() { list<int> lst1; list<tuple<int, int>> tplist; int n; scanf("%d", &n); lst1 = factorization(n); list<int>::iterator i = lst1.begin(); //2 2 2 2 3으로 저장된 리스트를 2,4 3,1로 저장되는 튜플리스트로 변경 tplist.push_back(make_tuple(*i++, 1)); list<tuple<int, int>>::iterator k = tplist.begin(); for (int j = 0;j < lst1.size()-1; i++,j++) { if (*i == get<0>(*k)) get<1>(*k)++; else { tplist.push_back(make_tuple(*i, 1)); k++; } } //튜플 리스트 출력 k = tplist.begin(); printf("%d = %d^%d ", n,get<0>(*k), get<1>(*k)); k++; for (k ; k != tplist.end(); k++) { printf("* %d^%d ", get<0>(*k), get<1>(*k)); } printf("\n"); return 0; } 소인수 분해 알고리즘 작성하다가 출력방식을 식으로 표현하고 싶어서 튜플 STL 사용해서 구현 해봤는데요, 원하는 결과는 나오지만 알고리즘 공부 걸음마 수준이라서 메모리나 시간복잡도를 고려하면서 작성하기 어렵네요. 더 간단하게 구현할 수 있는 방법이나 불필요한 코드 삽입된거 있으면 피드백 부탁드립니다. 실행결과: 8400 8400 = 2^4 * 3^1 * 5^2 * 7^1 8년 전
3개의 댓글이 있습니다. hyunhwan 소인수 분해 과정 중에서 매우 큰 소수일 경우에 오랜 시간이 걸릴 것 같습니다. 8년 전 link hyunhwan 아마 n>1이 들어있는 조건문에 div*div<=n을 붙여 보는것이 좋을 것 같습니다. 8년 전 link alghost 조안감사합니다 한번 해볼게요! 8년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
alghost
소인수 분해 알고리즘 작성하다가 출력방식을 식으로 표현하고 싶어서 튜플 STL 사용해서 구현 해봤는데요, 원하는 결과는 나오지만 알고리즘 공부 걸음마 수준이라서 메모리나 시간복잡도를 고려하면서 작성하기 어렵네요. 더 간단하게 구현할 수 있는 방법이나 불필요한 코드 삽입된거 있으면 피드백 부탁드립니다.
실행결과:
8400
8400 = 2^4 * 3^1 * 5^2 * 7^1
8년 전