🔒 문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
⌨ 입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)
🖨 출력
첫째 줄에 A+B를 출력한다.
📚 예제
Ex1)
9223372036854775807 9223372036854775808
18446744073709551615
💡반례1)
1 999
1000
💡반례2)
999 1
1000
📌 풀이
신경써야 할 부분
문자열 ans에 각 자리수 합 대입
- 일단 세 가지 경우로 나뉨
1) A문자열 길이 > B문자열 길이
2) A문자열 길이 = B문자열 길이
3) A문자열 길이 < B문자열 길이 - A와 B의 각 인덱스를 더할 때, 둘의 합이 10을 넘길 수 있음
=> A와 B의 합을 10으로 나눈 나머지를 ans에 대입
=> A와 B의 합을 10으로 나눈 값을 r로 두고 다음 인덱스들끼리 더할때 더해줌 ( r==0 || r==1 ) - 1-1,1-3의 경우 1+999 나 999+1의 경우 처럼 일의 자리끼리 더했을때 10 이상이되어 계속해서 앞 자리 수에 1이 더해질 수 있다
- 1-2의 경우 A와 B의 가장 큰 자리수 끼리 더했을때 10이 넘는 경우가 있다는 것을 조심
- ans에 대입할 때, 일의 자리수의 합이 ans[0]에 저장되고, 가장 큰 자리수의 합이 ans의 마지막 index에 대입되니까, printf 할 때, 거꾸로 맨 뒤에서부터 출력해야함.
+) 참고
- 문자 -> 정수 : 문자 - '0'
- 정수 -> 문자 : 정수 + '0'
🔑 c언어 코드
#include <stdio.h>
#include <string.h>
void sum_print(char* ans);
int main()
{
char* A, * B, * ans;
A = malloc(sizeof(char) * 10009);
B = malloc(sizeof(char) * 10009);
ans = malloc(sizeof(char) * 10009);
scanf("%s %s", A, B);
int a = strlen(A) - 1;
int b = strlen(B) - 1;
int c; // c는 A와 B 각 자리수 더한 값 % 10
int r = 0; // r은 A와 B 각 자리수 더한 값 / 10
int j = 0; // ans의 index
if (a > b)
{
while (1)
{
if (b == -1)
{
for (int i = a; i > -1; i--)
{
c = (A[i] - '0') + r;
r = c / 10;
c = c % 10;
if ((i == 0) && (r == 1))
{
ans[j++] = '0';
ans[j++] = '1';
break;
}
ans[j++] = (c + '0');
}
break;
}
c = (A[a--] - '0') + (B[b--] - '0') + r;
r = c / 10;
c %= 10;
ans[j++] = (c + '0');
}
ans[j] = '\0';
}
else if (a == b)
{
while (1)
{
if (b == -1)
break;
c = (A[a] - '0') + (B[b] - '0') + r;
r = c / 10;
c %= 10;
if ((a == 0) && (b == 0) && (r == 1))
{
ans[j++] = (c + '0');
ans[j++] = '1';
break;
}
ans[j++] = (c + '0');
a--;
b--;
}
ans[j] = '\0';
}
else
{
while (1)
{
if (a == -1)
{
for (int i = b; i > -1; i--)
{
c = (B[i] - '0') + r;
r = c / 10;
c = c % 10;
if ((i == 0) && (r == 1))
{
ans[j++] = '0';
ans[j++] = '1';
break;
}
ans[j++] = (c + '0');
}
break;
}
c = (A[a--] - '0') + (B[b--] - '0') + r;
r = c / 10;
c %= 10;
ans[j++] = (c + '0');
}
ans[j] = '\0';
}
sum_print(ans);
return 0;
}
void sum_print(char* ans)
{
int n = strlen(ans);
for (int i = n - 1; i > -1; i--)
printf("%c", ans[i]);
}
c언어로 풀면 실3이란 말이 맞았으면 좋겠당,,,ㅜㅠ
'BAEKJOON > 단계별로 풀어보기' 카테고리의 다른 글
[BOJ] 2581번 : 소수 (0) | 2022.08.12 |
---|---|
[BOJ] 1978번 : 소수 찾기 (2) | 2022.08.12 |
[BOJ] 25304번 : 영수증 (0) | 2022.08.11 |
[BOJ] 3003번 : 킹, 퀸, 룩, 비숍, 나이트, 폰 (0) | 2022.08.11 |
[BOJ] 2839번 : 설탕 배달 (0) | 2022.08.11 |