▽문제 바로가기
https://codeup.kr/problem.php?id=3022
입력
큰 수 a, b가 두 줄에 걸쳐 입력된다. (a, b는 100자리 이하)
출력
a-b의 결과를 출력한다.
문제 풀이
큰 수 덧셈보다 생각해야 할 부분이 더 있습니다.
제가 구현했던 방법은 다음과 같습니다.(*코드가 많이 지저분합니다.)
1. a와 b의 길이를 파악하여 길이가 긴 값을 기준으로 맞추고 나머지 0으로 채웁니다.
ex) a가 111이고 b가 1이면 a는 그대로 111, b는 001로 명시해줍니다.
2. 음수인지 판별
1차적으로 길이로 비교합니다. 길이가 같다면 처음수부터 마지막수까지 다를 때까지 비교합니다.
ex) a가 1111이고 b가 1100이면 a[2], b[2] 까지 비교하면서 음수 여부를 확인합니다.
3. 계산과정
a-b가 음수이면 b-a를 계산하고 앞에 '-' 마이너스 기호 붙여줍니다.
4. 앞에 0과 뒤에 0을 제거
ex) a가 11111이고 b가 11011이면 a-b는 00100이므로 앞뒤 0을 제거하여 0으로 만들어줍니다.
#include <stdio.h>
#include <iostream>
using namespace std;
int main(){
char a[102] = {0,}, b[102] = {0,};
char ret[102] = {0,};
bool isNN = false;
gets(a);
gets(b);
//길이 파악
int cnt1 = 0;
for(;;cnt1++){
if(a[cnt1]<48||a[cnt1]>57) break;
}
int cnt2 = 0;
for(;;cnt2++){
if(b[cnt2]<48||b[cnt2]>57) break;
}
int max = cnt1>cnt2? cnt1 : cnt2;
//긴 값으로 정렬
int temp2 = cnt2;
for(int i=max;i>=max-cnt2;i--){
b[i-1] = b[temp2-1];
temp2--;
}
int temp1 = cnt1;
for(int i=max;i>=max-cnt1;i--){
a[i-1] = a[temp1-1];
temp1--;
}
//빈칸 0으로 채우기
if(cnt1==max) {
for(int i=0;i<cnt1-cnt2;i++) b[i] = '0';
}
if(cnt2==max) {
for(int i=0;i<cnt2-cnt1;i++) a[i] = '0';
}
//음수인지 판별
if(cnt2>cnt1)isNN = true;
if(cnt2==cnt1){
for(int i=0;i<max;i++){
if(a[i]<b[i]){
isNN = true;
break;
}
}
}
int i=0;
if(isNN==false){
for(;0<max;i++){
int num1 = a[max-1]-48;
int num2 = b[max-1]-48;
if(num1<0||num1>9) num1 = 0;
if(num2<0||num2>9) num2 = 0;
int sum = ret[i] + num1 - num2;
if(sum<0){
--ret[i+1];
sum += 10;
}
ret[i] = (sum + 48);
max--;
}
}
if(isNN==true){
for(;0<max;i++){
int num1 = a[max-1]-48;
int num2 = b[max-1]-48;
if(num1<0||num1>9) num1 = 0;
if(num2<0||num2>9) num2 = 0;
int sum = ret[i] + num2 - num1;
if(sum<0){
--ret[i+1];
sum += 10;
}
ret[i] = (sum + 48);
max--;
}
}
//앞 뒤 0제거
i--;
int j=i;
for(;j>=0;j--){
if(ret[j]!=48) break;
}
i=j;
if(i==-1) {ret[0] = '0'; i=0;}
int k=0;
for(;k<=i;k++){
if(ret[k]!=0) break;
}
//음수이면 -출력
if(isNN==true) printf("-");
for(;i>=k;i--){
printf("%c", ret[i]);
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C/C++] 코드업(codeup) 3127번 수식 계산 1 (0) | 2020.02.10 |
---|---|
[C/C++] 코드업(codeup) 3102번 STL stack (0) | 2020.02.09 |
[C/C++] 코드업(codeup) 4745번 부등호 (0) | 2020.02.06 |
[C/C++] 코드업(codeup) 4439번 벽장문의 이동 (0) | 2020.02.05 |
[C/C++] 코드업(codeup) 4434번 좋은 수열 (0) | 2020.02.04 |