알고리즘/백준

백준 1252번 - 이진수덧셈(브론즈1)

원당컴 2020. 8. 31. 18:09
반응형

출처 : https://www.acmicpc.net/problem/1252

 

1252번: 이진수 덧셈

첫째 줄에 두 개의 이진수가 빈 칸을 사이에 두고 주어진다. 각 이진수는 1 또는 0으로만 이루어져 있으며, 0으로 시작할 수도 있다. 또한 각 이진수의 길이는 80을 넘지 않는다.

www.acmicpc.net

문제풀이> 80자리까지 나오기 때문에 이진수를 십진수로 변환하여 계산후 이진수로 변환하는 방법은 실패

문자열끼리의 합을 구해 주는데 앞의 '0'이 나온것을 제거 후 두개의 문자열의 개수를 동일하게 맞춘 후에 뒷자리 부터 계산하면서 올림수를 처리해 줄때까지 출력 하는 형식으로 처리함

#include <iostream>
#include <cstring>

using namespace std;

char binary1[100];
char binary2[100];


void SumBinary(char a[],char b[],int pos,int Round)
{
    if(pos<0 && Round ==0) return;
    int num = 0;
    if(pos>=0) num=a[pos] - '0' + b[pos] - '0';
    SumBinary(a,b,pos-1,(Round + num)/2);
    cout << (Round + num)%2;
}

int main()
{
    int first=0;
    cin >>binary1 >>binary2;
    ///앞의 '0'을 삭제하자
    int len1 = strlen(binary1);
    for(int i=0;i<len1;i++)
    {
        if(binary1[i]!='0') break;
        first++;
    }

    strcpy(binary1,binary1+first);
    len1 = strlen(binary1);

    first=0;
    int len2 = strlen(binary2);
    for(int i=0;i<len2;i++)
    {
        if(binary2[i]!='0') break;
        first++;
    }

    strcpy(binary2,binary2+first);
    len2 = strlen(binary2);

    //두개의 자리수를 동일하게 만들자.
    char temp[100]={0};
    if(len1>len2)
    {
        for(int i=len2;i<len1;i++) temp[i-len2]='0';
        strcat(temp,binary2);
        strcpy(binary2,temp);
    }
    else
    {
        if(len2==0) /// 두개 의 숫자가 모두 0 이면
        {
            cout << 0;
            return 0;
        }
        for(int i=len1;i<len2;i++) temp[i-len1]='0';
        strcat(temp,binary1);
        strcpy(binary1,temp);
    }

    //cout <<binary1 <<" " << binary2;
    SumBinary(binary1,binary2,strlen(binary1)-1,0); ///첫번째 문자열,두번째 문자열,계산할 위치,올림수

    return 0;
}

 

반응형