프로그래밍/백준

문자열문자열 백준 10757 큰 수 구하기 - C언어

량아이 2022. 9. 22. 00:07

늘 말하는 이야기지만 나는 문자열을 좋아하지 않는다.

 

백준에서는 허용 범위를 초과하는 큰수는 에러가 나기 때문에 문자열을 이용하여 계산해야 하는데 나는 문자열을 잘 사용하지 못하기 때문에 이에 큰땀을 흘렸다.

 

처음엔 되겠지 하면서 

#include <stdio.h>
int main(){
    unsigned long long A, B;
    scanf("%llu %llu", &A,&B);
    printf("%llu",A+B);
}

입구컷!

 

이에 다른 블로그 글 들의 샅샅이 뒤져서 이해는 못하지만 억지로 내 코드랑 억지로 섞어서 만들어 봤지만 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
    char num1[10002], num2[10002]; //입력받을 값
    int a,b,x,i, cnt,sum=0, carry=0;
    scanf("%s %s",num1, num2);
    a= strlen(num1);
    b=strlen(num2);
    char bea1[a], bea2[b]; //재배열해 입력할 값
    cnt=0;
    for(i=a-1; i>=0;i--){ //첫번째 재배열
        bea1[cnt++] = num1[i];
    }
    cnt=0;
    for(i=b-1; i>=0;i--){ //두번째 재배열
        bea2[cnt++]=num2[i];
    }
    x= a>b?a:b;
    char result[x+1],real[x+1];
    for(i=0;i<x ;i++){
        sum +=bea1[i]-'0'+bea2[i]-'0'+carry;
        while(sum<0) sum +='0';
        if(sum>9) carry=1;
        else carry=0;
        sum%=10;
        result[i]= sum+'0';
        sum=0;
    }
    if(carry ==1)result[x]+='1';

    cnt=0;
    x=strlen(result);
    for(i=x-1; i>=0;i--){
        real[cnt++]=result[i];
    }
    printf("%s",real);
}

코드도 상당히 지저분하게 나올뿐더러 당연하게도 틀렸다.

 


그 이후로 잠깐 손 놓고있다가 다른 백준문제를 풀고 더욱 강해진 모습으로 다시 도전해봤는데

그동안 머리속에서 문자열에 대한 정리가 좀 되었는지 생각보다 더 수월하게 풀어졌다.

최종 코드

#include <stdio.h>
#include <string.h>
void reverse(char f[], int len){
    char temp;
    for(int i=0; i<len-- ;i++){
        temp = f[i];
        f[i]=f[len];
        f[len]=temp;
        
    }
}
int main(){
    char a[100002], b[100002];
    int lena,lenb, x, i, sum, carr=0;
    scanf("%s %s", a,b);
    lena=strlen(a);
    lenb=strlen(b);
    reverse(a,lena);// 역배열
    reverse(b,lenb);
    x=lena>lenb ? lena:lenb;

    char result[100002];
    
    for(i=0; i<x; i++){
        sum=a[i]-'0' + b[i]-'0' + carr;
        if (sum < 0)//자리수가 다를경우(sum < 0) sum은 -'0'이 한번 더 계산됨(둘중하나는 NULL이므로)
                {
                    sum += '0';//그런경우 +'0'을 해서 맞춰준다.
                    
                }
        carr=sum/10;
        result[i]=sum%10 +'0';
        
    }
    
    if(carr==1){
        result[x] = 1+'0';
    }
    x=strlen(result);
    reverse(result,x);
    printf("%s",result);
}

이전 코드보다 깔끔해진 모습에 너무 뿌듯했고, 이전엔 사용자 정의 함수에 대한 문자열 처리와 +-'0'에 대해 등등 생각치 못했던 것들을 얻어갈 수 있었다

여기서 가장 중요한건

if (sum < 0)//자리수가 다를경우(sum < 0) sum은 -'0'이 한번 더 계산됨(둘중하나는 NULL이므로)
{ sum += '0';//그런경우 +'0'을 해서 맞춰준다. }

이 코드라고 생각한다

 

이렇게 개고생해서 풀었지만 백준에선 브론즈 5다