짧고 간결한 프로젝트 오일러 문제 하나.
제목에서도 적었듯이 n제곱 해서 나온 숫자의 자릿수가 n인 모든 경우를 묻는 것이다.
다른 문제도 그렇지만, 이 문제는 일일이 제곱을 해가며 풀 수도 있다.
제곱의 결과가 64비트 범위를 넘어설 수도 있으니 이 부분을 해결할 아이디어만 있으면 된다.
하지만 그런 무식한(?) 방법보다는 로그를 활용하는 것이 훨씬 더 좋다.
일단 10진수 D의 자릿수가 n이라는 건
또한, 문제의 특성상 지수의 밑은 오로지 1~9 까지만 가능하다.
다시 말해서
이 식은 로그의 특성을 고려하면
그런데, 애초에
이 내용을 그대로 코드로 표현하면 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <iostream> #include <cmath> using namespace std;int main() { int count = 0; for ( int d = 1; d < 10; ++d) { double l10d = log10 (d); for ( int n = 1; ; ++n) { double ratio = (n - 1) / ( double )n; if (ratio <= l10d) { cout << d << "^" << n << endl; ++ count ; } if (ratio > l10d) { break ; } } } cout << count << "EA" << endl; } |
그런데, 조금만 생각해보면 안쪽 루프 자체를 제거해서 코드를 더 최적화할 수 있다.
여기서 n은 1 이상이어야 하므로 단순히
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> #include <cmath> using namespace std;int main() { int count = 0; for ( int d = 1; d < 10; ++d) { double l10d = log10 (d); int x = ( int )(1.0 / (1 - l10d)); cout << x << endl; count += ( int )x; } cout << count << "EA" << endl; } |
제곱근의 연분수 전개시 반복되는 숫자가 홀수 개인 경우는? (0) | 2020.11.08 |
---|---|
endianness 삽질기 (3) | 2020.10.17 |
정공법으로 소수 판별 시 더 빠른 방법은? (0) | 2020.03.28 |
대각선에서 소수의 비율이 10% 이하가 되는 값 찾기 (0) | 2020.03.26 |
ln(), pow(), exp() 함수 구현 / 마무리 (0) | 2020.03.22 |
내 블로그 - 관리자 홈 전환 |
Q
Q
|
---|---|
새 글 쓰기 |
W
W
|
글 수정 (권한 있는 경우) |
E
E
|
---|---|
댓글 영역으로 이동 |
C
C
|
이 페이지의 URL 복사 |
S
S
|
---|---|
맨 위로 이동 |
T
T
|
티스토리 홈 이동 |
H
H
|
단축키 안내 |
Shift + /
⇧ + /
|
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.