백준 10757번
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. (0 < A,B < 10^10000)
출력
첫째 줄에 A+B를 출력한다.
#include <stdio.h>
#define Result(a,b) {int n; n=a, a=b, b=n;}
void Reverse(char *ar, int length){
int left, right;
for(left=0,right=length-1; ; left++,right--){
if(left>=right){break;}
Result(ar[left], ar[right]);
}
}
int main()
{
// 1이상, 10^9999이하 값(올림 시 10^10000포함) + '\0'
char arA[10001], arB[10001];
int i,j;
// 입력받고
scanf("%s %s", &arA, &arB);
// 십진수(정수)로 변환, NULL 종료 문자 만날 때까지 반복
for(i=0; *(arA+i); i++){
arA[i]-='0';
}
for(j=0; *(arB+j); j++){
arB[j]-='0';
}
// 계산식 쉽게 만들기 위해 배열 뒤집고
Reverse(arA, i);
Reverse(arB, j);
// 길이가 더 긴거 찾고
i= i>=j ? i: j;
// 값 계산
for(j=0; j<i; j++){
arA[j]= arA[j]+arB[j];
if(arA[j]>=10){
arA[j+1]+=1;
arA[j]%=10;
}
}
// 마지막 값이 널 종료 문자와 다른 경우 즉, 길이가 늘어났을 때의 예외 처리
// C의 문자형 배열은 값이 할당된 부분을 제외하곤 전부 널 종료 문자로 채워진다.
if(arA[i]!='\0'){i++;}
// 출력 전 다시 배열 뒤집기
Reverse(arA, i);
// 문자형으로 변환
for(j=0; j<i; j++){
arA[j]+='0';
}
//마지막 출력
printf("%s", arA);
}
주석에 간단하게 설명을 적어뒀다.
참고로 입력값은 최대 10^9999이지만 두 값을 더했을 땐 10^10000 이상이 될 수 있다.
여기에 널 종료문자까지 포함해야 되므로 10001의 크기를 갖는 배열을 선언한 것이다.
아래 계산식은 사람이 계산하는 것처럼 일의 자리부터 더한 후 다음 자릿수에 값을 올림 하는 아주 간단한 형태이므로 따로 설명이 필요 없을 것 같다.
배열의 크기가 늘어난 경우, 널 종료문자(ASCII 0)에 +=1 즉, 1이란 정수 값을 가지므로 if(arA[i]!='\0')만으로도 예외처리가 가능하다.
반응형
'컴퓨터 > C, C++' 카테고리의 다른 글
[C/C++] 백준 2581번 C언어 (0) | 2022.06.07 |
---|---|
[C/C++] 백준 1978번 C언어 (0) | 2022.06.07 |
[C/C++] 백준 2839번 C언어 (0) | 2022.06.03 |
[C/C++] 백준 2775번 C언어 (2) | 2022.06.02 |
[C/C++] 백준 10250번 C언어 (0) | 2022.06.01 |
댓글