{ }codelper
큰 정수(64비트)넘침(오버플로)합계P0015

큰 합계

첫 줄에 정수의 개수 n, 둘째 줄에 정수 n개가 공백으로 구분되어 주어진다.
n개의 합을 출력하라.

입력
1 ≤ n ≤ 10,000, -1,000,000,000 ≤ 각 수 ≤ 1,000,000,000 (수 하나하나는 32비트 int에 들어간다)
출력
합 한 줄 (-10^13 이상 10^13 이하)
예시 1 · stdin
3
1000000000 1000000000 1000000000
stdout
3000000000
예시 2 · stdin
4
5 -2 7 -10
stdout
0
main.py
입력(stdin)

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

$ 준비됐어요

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

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

수 하나는 int(32비트, 약 ±21억)에 들어가지만 합은 들어가지 않아요.
그래서 수는 int로 읽어도 되지만 합을 모으는 변수는 64비트여야 해요: C·C++ long long(C의 long은 Windows에서 32비트), Java·C# long.
int로 두면 오류 없이 엉뚱한 수가 나와요 — Java·C#은 기본이 넘침을 알리지 않고 돌아가고(C#은 checked로 감싸면 예외), C·C++에서는 부호 있는 정수 넘침이 정의되지 않은 동작이에요.
Python 정수는 크기 제한이 없고, JS·TS·크레이콘은 수가 하나(배정밀도)라 2^53(약 9×10^15)까지 정확해서 최대 10^13인 이 문제는 그냥 돼요.

Pythonmain.py · 2 줄
n = int(input())print(sum(map(int, input().split())))
JavaScriptmain.js · 3 줄
const [n, ...a] = require("fs").readFileSync(0, "utf8").trim().split(/\s+/).map(Number);// 합은 최대 10^14 — 2^53(약 9×10^15)보다 작아서 Number로 정확하다console.log(a.reduce((s, x) => s + x, 0));
TypeScriptmain.ts · 3 줄
import { readFileSync } from "node:fs";const [n, ...a]: number[] = readFileSync(0, "utf8").trim().split(/\s+/).map(Number);console.log(a.reduce((s, x) => s + x, 0));
JavaMain.java · 14 줄
import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.StringTokenizer; public class Main {    public static void main(String[] args) throws Exception {        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));        int n = Integer.parseInt(br.readLine().trim());        StringTokenizer st = new StringTokenizer(br.readLine());        long total = 0; // 수 하나는 int에 들어가도 합은 long이 필요하다        for (int i = 0; i < n; i++) total += Integer.parseInt(st.nextToken());        System.out.println(total);    }}
C#Main.cs · 13 줄
using System; class Program{    static void Main()    {        Console.ReadLine();        long total = 0; // int로 두면 조용히 넘친다(C#은 기본이 unchecked)        foreach (string s in Console.ReadLine().Split(' ', StringSplitOptions.RemoveEmptyEntries))            total += int.Parse(s);        Console.WriteLine(total);    }}
C++main.cpp · 14 줄
#include <iostream> int main() {    std::ios::sync_with_stdio(false);    std::cin.tie(nullptr);    int n, x;    long long total = 0;    std::cin >> n;    for (int i = 0; i < n; i++) {        std::cin >> x;        total += x;    }    std::cout << total << '\n';}
Cmain.c · 13 줄
#include <stdio.h> int main(void) {    int n, x;    long long total = 0; /* long은 Windows에서 32비트라 long long을 쓴다 */    scanf("%d", &n);    for (int i = 0; i < n; i++) {        scanf("%d", &x);        total += x;    }    printf("%lld\n", total);    return 0;}
Craykonmain.cray · 8 줄
n = 콘솔.줄읽기().수로변환();수들 = 콘솔.수들읽기();합 = 0;각각 (x 에서 수들){    합 += x;}콘솔.쓰기(합);