반응형
출처: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=649&sca=50
Approach
Input Data가 200자리이기 때문에 정수형으로 받을 수 없습니다.
두 수를 각각 숫자 배열의 맨 끝(200번)부터 차례대로 넣습니다.
뺄셈 연산을 위해 큰 수를 첫번째 배열에, 달느 수를 두번째 배열에 넣습니다.
ex) 6789, 12345
① 최대 배열 크기 200에 맞추어 Data를 우측배열 시킵니다.
Input Data를 문자열로 받았기 때문에 int형으로 전환
② ± 연산에 따라 값을 처리합니다.
+: 두 수를 더해서 10이상인 경우 다음 자리에 +1 처리.
-: 두 수를 빼서 음수인 경우 앞자리에서 도움수를 받습니다.
(A ≥ B 이므로 마지막 단계에서 오류가 나지 않습니다.)
#include <stdio.h>
int strLen(char *str){
int len = 0;
while(str[len]) len++;
return len;
}
int comp(char *a, char* b){
int an = strLen(a), bn = strLen(b);
if(an != bn) return an > bn;
for(int i=0; i<an; i++){
if(a[i] != b[i]) return a[i] > b[i];
}
return 1;
}
void encode(char *a, int *A){
// A[] 끝에서부터 a[] 배열길이 만큼 채워갑니다.
for(int i=strLen(a) - 1, j=200; i>=0; i--, j--){
A[j] = a[i] - 48;
}
}
void output(int *A){
int i;
// 앞쪽에 비워져 있는 부분 생략
for(i=0; i<200; i++)
if(A[i]) break;
for(; i<=200; i++) printf("%d", A[i]);
printf("\n");
}
void process(char *a, char* b){
int A[210] = {0}, B[210] = {0};
int sum[210] = {0}, sub[210] = {0};
// 배열크기 200으로 설정해서 우측배열 시키기
encode(a, A); encode(b, B);
for(int i=200; i>0; i--){
sum[i] += A[i] + B[i];
// 올림수 처리
if(sum[i] >= 10){
sum[i-1]++;
sum[i] -= 10;
}
sub[i] += A[i] - B[i];
// 7 - 9 = -2와 같은 경우
if(sub[i] < 0){
sub[i-1]--;
sub[i] += 10;
}
}
output(sum); output(sub);
}
int main(){
char astr[210], bstr[210];
while(1){
scanf("%s %s", astr, bstr);
if(astr[0] == '0' && bstr[0] == '0')
break;
if(comp(astr, bstr))
process(astr, bstr);
else
process(bstr, astr);
}
}
반응형
'PS 문제 풀이 > Jungol' 카테고리의 다른 글
[Jungol] 정올 1274 2진수를 10진수로... (0) | 2021.03.17 |
---|---|
[Jungol] 정올 1262 긴 자릿수 곱셈 (0) | 2021.03.16 |
[Jungol] 정올 1035 최대값 (0) | 2021.03.16 |
[Jungol] 정올 1936 꼭지점 개수 (0) | 2021.03.16 |
[Jungol] 정올 1839 배부른 돼지 (0) | 2021.03.16 |
댓글