2022. 4. 2. 00:12ㆍ알고리즘/백준
https://www.acmicpc.net/problem/4150
4150번: 피보나치 수
피보나치 수열은 다음과 같이 그 전 두 항의 합으로 계산되는 수열이다. 첫 두 항은 1로 정의된다. f(1) = 1, f(2) = 1, f(n > 2) = f(n − 1) + f(n − 2) 정수를 입력받아, 그에 해당하는 피보나치 수를 출력
www.acmicpc.net
문제를 읽어보면 알 수 있듯이 숫자의 길이가 100자리가 넘어간다.
이런 문제는 long long int도 메모리 초과가 뜨기 때문에 어떻게 풀까? 고민해봐야 된다.
정답은 문자열string을 쓰면 되는데 문제를 풀 때 피보나치 수를 직접 적어보면서 코드를 어떻게 짤지 고민을 해봤다.
//1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 피 보나 치수
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #include <iostream> #include <string> using namespace std; int main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false); string str="1"; int n; cin >> n; string copy; copy = str; string tmp; for (int i = 2; i < n; i++) { tmp = str; for (int j = 0; j < copy.size(); j++) { str[j] += (copy[j]-'0'); if (j < copy.size() && str[j]>'9') { str[j] -= 10; if (j+1 < str.size()) str[j + 1] += 1; else if (j+1 == copy.size()) str += '1'; } } copy = tmp; } for (int i = str.size(); i != 0; i--) { cout << str[i-1]; } return 0; } | cs |
코드를 설명하면 string은 수를 더했을 때 1의자릿수를 배열의 0번째 10의 자리 수를 배열의 1번째 넣는다고 생각했다. 그리고 1의 자리수 부터 더해갔을때 만약에 그 수가 '10'보다 크면 10을 빼주고 다음자리수에 1을 더해준다. 만약에 다음 자리수를 넣을 배열이 존재하지 않는다면? 그 문자열에 '1'을 추가해준다.
3줄 요약
1. 자릿수 거꾸로 해서 더해줌 (더하기에 용이)
2. 더했을 때 '10'을 넘는지 확인 넘으면 다음 배열 더해줌
3. 다음 배열 더할 조건이 왔을 때, 배열의 크기를 초과하면 문자 '1'을 추가해줌
'알고리즘 > 백준' 카테고리의 다른 글
백준 24479 C++ (0) | 2022.05.28 |
---|---|
백준 22351 수학은 체육과목 입니다. 3 (0) | 2022.05.23 |
(C++) 백준 1111번 IQ Test (0) | 2021.12.01 |
백준 다리놓기 1010 C++ (0) | 2021.11.26 |
백준 1018 c++ 완전탐색(Brute-force Serch) (0) | 2021.11.03 |