반응형

백준 10757번 큰 수 A+B 풀이 코드

C | C++ | Java | Python


풀이

C로는 문제에서 주는 긴 수를 바로 더하기 어렵습니다. 문제 난이도 책정이 Python이나 Java기준으로 된 것 같습니다.

일단 큰 배열을 선언하여 숫자를 문자열로 받고 뒷자리부터 하나씩 더합니다. 더할 때 올림이 발생하면 높은 자릿수에 1을 더해줍니다. 더하려는 두 수 중 한쪽이 더 길다면 덧셈 후 나머지 자리는 긴 숫자를 그대로 넣어줍니다. 맨 끝 자리의 올림수 여부를 꼭 확인해 주세요. 올림 처리는 반복되므로 up() 함수를 따로 작성했습니다.

큰 배열을 선언하여 숫자를 문자열로 받고 뒷자리부터 하나씩 더합니다. 더할 때 올림이 발생하면 높은 자릿수에 1을 더해줍니다. 더하려는 두 수 중 한쪽이 더 길다면 덧셈 후 나머지 자리는 긴 숫자를 그대로 넣어줍니다. 맨 끝 자리의 올림수 여부를 꼭 확인해 주세요. 올림 처리는 반복되므로 up() 함수를 따로 작성했습니다.

Java는 긴 수, BigInteger를 지원합니다. 이를 사용해 덧셈을 출력합니다.

Python은 긴 수를 더하는 데 별다른 처리가 필요 없습니다. 입력을 받아 그대로 덧셈을 출력합니다.

코드

#include <stdio.h>
#include <string.h>

void up(int *rlt, int idx){
    if(rlt[idx] > 9){
        rlt[idx-1] += rlt[idx]/10;
        rlt[idx] = rlt[idx]%10;
    }
}

int main(){
    char a[10001]={0}, b[10001]={0};
    scanf("%s %s", a, b);
    int n = strlen(a), m = strlen(b), temp, i, result[10002]={0,}, sml, big;
    if(m > n){ sml = n; big = m;}
    else{ sml = m; big = n; }

    for(i = 0 ; i < sml; i++){
        temp = (a[n-1-i]-'0') + (b[m-1-i]-'0'); //문자에서 '0'을 빼면 숫자와 동일
        result[big+1-i] += temp;
        up(result, big+1-i);
    }
    temp = i;
    for(i = temp; i < big; i++){
        if(big == n){
            result[big+1-i] += a[big-1-i]-'0';
            up(result, big+1-i);
        }
        else{
            result[big+1-i] += b[big-1-i]-'0';
            up(result, big+1-i);
        }
    }

    int flag = 0;
    for(i = 0 ; i < big+2; i++){
        if (flag == 0) {
            if (result[i] != 0)
                flag = 1;
            else if (i == big+1)
                printf("0");
        }
        if (flag != 0)
            printf("%d", result[i]);
    }
    return 0;
}
#include <iostream>
#include <cstring>
using namespace std;

void up(int *rlt, int idx){
    if(rlt[idx] > 9){
        rlt[idx-1] += rlt[idx]/10;
        rlt[idx] = rlt[idx]%10;
    }
}

int main(){
    char a[10001]={0}, b[10001]={0};
    cin>>a>>b;
    int n = strlen(a), m = strlen(b), temp, i, result[10002]={0,}, sml, big;
    if(m > n){ sml = n; big = m;}
    else{ sml = m; big = n; }

    for(i = 0 ; i < sml; i++){
        temp = (a[n-1-i]-'0') + (b[m-1-i]-'0'); //문자에서 '0'을 빼면 숫자와 동일
        result[big+1-i] += temp;
        up(result, big+1-i);
    }
    temp = i;
    for(i = temp; i < big; i++){
        if(big == n){
            result[big+1-i] += a[big-1-i]-'0';
            up(result, big+1-i);
        }
        else{
            result[big+1-i] += b[big-1-i]-'0';
            up(result, big+1-i);
        }
    }

    int flag = 0;
    for(i = 0 ; i < big+2; i++){
        if (flag == 0) {
            if (result[i] != 0)
                flag = 1;
            else if (i == big+1)
                cout<<"0";
        }
        if (flag != 0)
            cout<<result[i];
    }
    return 0;
}
import java.util.Scanner;
import java.math.BigInteger;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        BigInteger a = sc.nextBigInteger();
        BigInteger b = sc.nextBigInteger();
        System.out.println(a.add(b));
    }
}
a,b = map(int,input().split())
print(a+b)

문제 출처

https://www.acmicpc.net/problem/10757

반응형

+ Recent posts