{ }codelper
범위 반복큰 정수(64비트)재귀P0010

피보나치 수

피보나치 수는 F(1) = F(2) = 1, F(k) = F(k-1) + F(k-2)로 정의된다.
n이 주어질 때 F(n)을 출력하라.

입력
1 ≤ n ≤ 70
출력
F(n)
예시 1 · stdin
10
stdout
55
예시 2 · stdin
50
stdout
12586269025
main.py
입력(stdin)

실행하면 이 줄들이 차례로 input()·표준 입력으로 들어가요(실행 중에 묻지 않아요).

$ 준비됐어요

코드를 입력해 풀려면 PC에서 열어 주세요. 모바일에서는 문제와 풀이를 볼 수 있어요.

다른 언어로는?언어별 풀이 보기 · 8개 언어 풀이

F(47)부터 32비트 int(약 21억)를 넘어요 — C·C++·Java·C#은 long/long long이 필요해요.
JavaScript·TypeScript·크레이콘은 2^53까지 정확해서 F(78)까지 괜찮고, Python은 끝이 없어요.
재귀로 그대로 쓰면 n = 70에서 너무 느려서, 앞의 두 값만 들고 가는 반복문이 좋아요.

Pythonmain.py · 5 줄
n = int(input())a, b = 1, 1for _ in range(n - 1):    a, b = b, a + bprint(a)
JavaScriptmain.js · 4 줄
const n = Number(require("fs").readFileSync(0, "utf8"));let a = 1, b = 1;for (let i = 1; i < n; i++) [a, b] = [b, a + b];console.log(a);
TypeScriptmain.ts · 5 줄
import { readFileSync } from "node:fs";const n: number = Number(readFileSync(0, "utf8"));let a: number = 1, b: number = 1;for (let i = 1; i < n; i++) [a, b] = [b, a + b];console.log(a);
JavaMain.java · 14 줄
import java.util.Scanner; public class Main {    public static void main(String[] args) {        int n = new Scanner(System.in).nextInt();        long a = 1, b = 1;        for (int i = 1; i < n; i++) {            long next = a + b;            a = b;            b = next;        }        System.out.println(a);    }}
C#Main.cs · 15 줄
using System; class Program{    static void Main()    {        int n = int.Parse(Console.ReadLine());        long a = 1, b = 1;        for (int i = 1; i < n; i++)        {            (a, b) = (b, a + b);        }        Console.WriteLine(a);    }}
C++main.cpp · 13 줄
#include <iostream> int main() {    int n;    std::cin >> n;    long long a = 1, b = 1;    for (int i = 1; i < n; i++) {        long long next = a + b;        a = b;        b = next;    }    std::cout << a << '\n';}
Cmain.c · 14 줄
#include <stdio.h> int main(void) {    int n;    scanf("%d", &n);    long long a = 1, b = 1;    for (int i = 1; i < n; i++) {        long long next = a + b;        a = b;        b = next;    }    printf("%lld\n", a);    return 0;}
Craykonmain.cray · 10 줄
n = 콘솔.줄읽기().수로변환();a = 1;b = 1;반복 (i = 1; i < n; i++){    next = a + b;    a = b;    b = next;}콘솔.쓰기(a);