#21 - 소인수분해 [쉬움]

2019. 1. 16. 21:22카테고리 없음

728x90



unsigned long long (int) 자료형이 표현 가능한 수의 범위는 0~18,446,744,073,709,551,615 이다.


614,889,782,588,491,410[각주:1]


위 값이 주어진 자료형의 범위에서 15종의 서로 다른 인수를 갖게하는 최소의 수이다.

'16종의 인수를 갖는 최소의 수'를 포함하여 표현 가능한 수의 범위를 넘어선 수에 대해서는 오버플로우 현상으로 인해 제대로 된 결과를 얻을 수 없다. 그런 예외적인 상황은 밑에서 다루기로 한다.




ull(unsigned long long) 자료형을 가진 두 수를 선언하고, 변수 N에 입력값을 저장한다.

변수 N은 변하지 않고 입력값을 그대로 저장하고 있고,

변수 n은 중간에 연산을 통해 1이 될 때까지 변하게 된다.



밑은 A, 지수를 K로 갖는 거듭제곱수 A^K를 구조체를 사용하여 정의했다.  


n이 factor로 나누어 떨어질 때(factor가 n의 인수일 때; (n%factor==0)일 때), A와 K를 기록한다.

n을 factor로 나누면서 위 과정을 반복한다.

n이 factor로 나누어 떨어지지 않으면, 인수의 값 factor를 1씩 늘린다.

(n==1)이 될 때까지 위 과정을 반복하면서 N의 모든 인수를 찾는다.





만약 너무 큰 값을 입력하면 오버플로우 현상으로 인해 제대로 된 결과가 출력되지 않는다.

잘못된 결과를 활용할 상황을 우려하여 검산을 할 수 있도록 만들었다.


처음에 실제로 입력한 값과 두번째 줄의 오버플로우되어 실질적으로 저장된 값을 비교할 수 있다. 만약, 두 값이 서로 다르다면 그것은 ull 자료형의 표현 가능한 범위 이상 크기의 정수를 입력했기 때문에 오류가 발생한 것이다.

보다 직관적인 검산을 위해선 입력값을 먼저 문자열을 통해 손실없이 저장한 뒤 결과값과 비교하면 될 것 같다.





마지막으로 결과를 출력하는 부분이다.

소수는 따로 처리되도록 만들었다.



  1. https://en.wikipedia.org/wiki/Primorial [본문으로]
728x90