Minwoo Dev.
[백준 10757번] 큰 수 A+B - C99 본문
728x90
반응형
SMALL
이 문제 생각보다 굉장히 복잡한 문제다.
파이썬이었다면 이렇게 어렵지 않게 해결했을 테지만 C언어로 이 문제를 해결하려니 정수를 담을 수 있는 크기 차이가 커서 난관에 부딪혔다.
인터넷에 검색하던 도중 굉장한 풀이 방식을 찾았다.
문자열 배열을 이용하여 문제를 해결하는 것이다.
숫자를 문자열에 한 자릿수씩 넣고 그 문자열을 역순으로 뒤집는 reserve 함수를 만들어 앞에서부터 숫자가 들어가는 배열의 성질을 정확히 이용한 풀이다.
위와 같은 방식으로 해결하면 된다.
이 reserve 함수를 만들어 해결하는 소스 코드를 첨부하겠다.
ASCII 코드표를 봐야하는 부분도 있기에 더 자세히 공부해봐야 할 거 같다.
#include <stdio.h>
#include <string.h>
void reverse(char arr[]) //문자열 역순 정렬
{
int len = strlen(arr);
for (int i = 0; i < len / 2; i++)
{
char temp = arr[i];
arr[i] = arr[len - i - 1];
arr[len - i - 1] = temp;
}
}
int main() {
char A[10002] = { 0 };
char B[10002] = { 0 };
char res[10003] = { 0 };
int carry = 0; //자리수 올림
int len = 0;
scanf("%s %s", A, B);
reverse(A);
reverse(B);
if (strlen(A) > strlen(B)) //큰수 기준
{
len = strlen(A);
}
else
{
len = strlen(B);
}
for (int i = 0; i < len; i++)
{
int sum = A[i] - '0' + B[i] - '0' + carry; //ASCII 코드 보며 이해할 것
if (sum < 0)//자리수가 다를경우(sum < 0) sum은 -'0'이 한번 더 계산됨(둘중하나는 NULL이므로)
{
sum += '0';//그런경우 +'0'을 해서 맞춰준다.
}
if (sum > 9)
{
carry = 1; //더한것이 9를 넘어가면 그 다음자리수 +1 해줘야하므로
}
else
{
carry = 0;
}
printf("A[%d] = %c , B[%d] = %c\n", i, A[i], i, B[i]);//시각화를 위한 코드
res[i] = sum % 10 +'0';
}
if (carry == 1)
{
res[len] = '1';
}
reverse(res); //180도 돌려놨던 것을 다시 180도 돌려 원상복구
printf("%s", res);
return 0;
}
728x90
반응형
LIST
'백준' 카테고리의 다른 글
별 그리기에서 아차 싶었던 나의 복습 (0) | 2023.06.06 |
---|---|
[백준 2439번] 별 찍기 - 2 - C99 (0) | 2023.06.06 |
[백준 4999번] 아! - C99 (0) | 2023.06.06 |
[백준 4104번] 크냐? - C99 (0) | 2023.06.06 |
[백준 2741번] N 찍기 - C99 (0) | 2023.06.06 |