두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
첫째 줄에 A와 B가 주어진다. (0<A,B<1010000)
첫째 줄에 A+B를 출력한다.
- 숫자형 변수를 사용했다.
-> 훨씬 더 큰 자릿수를 다루기 때문에 숫자형 변수를 사용할 수 없다.- 계산 시 자릿수가 하나 증가하면, 배열의 인덱스가 한 칸 씩 모두 밀려나야하는 것을 간과했다.
- ASCII 코드에 대한 이해가 부족했다.
- 두 수의 자릿수가 다른 경우를 고려하지 않았다.
- 문자열 배열을 설정하고 역순으로 바꿔 한 자리 씩 덧셈한다. (자릿수가 다를 경우를 고려)
- 덧셈 결과를 reverse 함수를 이용해 다시 역순 정렬한다.
#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 sum[10003] = {0};
int carry = 0; // 자릿수 올림
int len = 0;
scanf("%s %s", A, B);
//printf("\nA = %s\nB = %s\n", A, B);
if(strlen(A) > strlen(B)) { len = strlen(A); }
else { len = strlen(B); } // 더 긴 자릿수를 len으로 할당
reverse(A);
reverse(B);
//printf("\nReverse:\nA = %s\nB = %s\n\n", A, B);
char s;
for(int i=0; i<len; i++) { // '0' = 48
if(A[i] == 0) { A[i] = '0'; } // 자릿수가 다를 경우 '0' 할당해주기
else if(B[i] == 0) { B[i] = '0'; }
s = A[i] + B[i] + carry;
//printf("%c + %c + %d = %d\n", A[i], B[i], carry, s);
if(s > 105) { // 10을 넘을 때
carry = 1;
sum[i] = s - 58; // '0'과 '10' 빼주기
//printf("1) sum[%d] = %c, %d\n\n", i, sum[i], sum[i]);
}
else {
carry = 0;
sum[i] = s - 48; // '0' 빼주기
//printf("2) sum[%d] = %c, %d\n\n", i, sum[i], sum[i]);
}
}
if(carry == 1) { sum[len] = '1'; } // 올림수 있을 경우
reverse(sum);
printf("%s", sum);
return 0;
}
뿌듯하다 *^^*