서로 다른 두 개의 소인수를 갖는 수들이 처음으로 두 번 연달아 나오는 경우는 다음과 같습니다.
14 = 2 × 7
15 = 3 × 5
서로 다른 세 개의 소인수를 갖는 수들이 처음으로 세 번 연속되는 경우는 다음과 같습니다.
644 = 2² × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19
서로 다른 네 개의 소인수를 갖는 수들이 처음으로 네 번 연속되는 경우를 찾으세요. 그 첫번째 숫자는 얼마입니까?
Click
첫번째 방법. 단순한 brute-force 로... 2.5초 정도 걸리네요.
14 = 2 × 7
15 = 3 × 5
서로 다른 세 개의 소인수를 갖는 수들이 처음으로 세 번 연속되는 경우는 다음과 같습니다.
644 = 2² × 7 × 23
645 = 3 × 5 × 43
646 = 2 × 17 × 19
서로 다른 네 개의 소인수를 갖는 수들이 처음으로 네 번 연속되는 경우를 찾으세요. 그 첫번째 숫자는 얼마입니까?
<script language="Javascript" type="text/javascript"> function func047(n){ var t = n; var cnt = 0; if(t%2==0){ cnt ++; do t/=2; while(t%2==0); } if(t%3==0){ cnt ++; do t/=3; while(t%3==0); } for(var i=5; i<=t; i+=6){ if(t%i==0){ cnt ++; do t/=i; while(t%i==0); } if(t%(i+2)==0){ cnt ++; do t/=i+2; while(t%(i+2)==0); } } return cnt; } function p047(){ var cnt = 4; for(var i=1; cnt>0; i++){ if(func047(i) == 4) cnt--; else cnt = 4; } alert(i-4); } </script>두번째 방법. 위의 방법에 단순하게 이전 기록을 저장하면서 이전 기록을 참조. 0.05초? 그 이하도 나오는 듯하네요.
<script language="Javascript" type="text/javascript"> function func047(n,nums){ if(n<2) return 0; if(n%2==0){ nums[n] = (n==2)?1:(nums[n/2] + ((n%4==0)?0:1)); return nums[n]; } if(n%3==0){ nums[n] = (n==3)?1:(nums[n/3] + ((n%9==0)?0:1)); return nums[n]; } for(var i=5; i*i<=n; i+=6){ if(n%i==0){ nums[n] = nums[n/i] + ((n%(i*i)==0)?0:1); return nums[n]; } if(n%(i+2)==0){ nums[n] = nums[n/(i+2)] + ((n%((i+2)*(i+2))==0)?0:1); return nums[n]; } } nums[n] = 1; return 1; } function p047(){ var nums = [0,0]; var cnt = 4; for(var i=1; cnt>0; i++){ if(func047(i,nums) == 4) cnt--; else cnt = 4; } alert(i-4); } </script>46번부터 시간을 체크하기 시작했는데 javascript는 시도할때마다 시간 오차가 좀 있네요.
댓글 없음:
댓글 쓰기