본문 바로가기
PS 문제 풀이/Jungol

[Jungol] 정올 1262 긴 자릿수 곱셈

by 까망 하르방 2021. 3. 16.
반응형

출처: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=545&sca=5090

Approach

부호처리

부호의 경우 어느 한쪽만 음수인 경우 곱셈결과에 부호를 붙이면 됩니다.

단, 곱셈처리된 피연산자 영역을 전달하기 위해 아래와 같이 인자를 전달합니다.

if) a가 음수라면 a + 1, 양수이면 a + 0으로 시작주소가 던져집니다. (b도 마찬가지)

 

곱셈 처리

앞에서 부터 이중 for문으로 A[i] 각 자리와 B[j]들을 곱한 결과를 ans[]에 누적합니다.

 

뒤에서 부터 ans[]에 누적된 값들을 아래와 같이 처리합니다.


#include <stdio.h>
 
int strlen(const char* s, int len = 0){
    while (s[len]) len++;
    return len;
}
 
void multi(char* a, char* b) {
    int ans[210] = { 0 };
    int aLen = strlen(a), bLen = strlen(b);
    for (int i = 0; i < aLen; i++) {
        for (int j = 0; j < bLen; j++) {
            ans[i + j] += (a[i] - 48) * (b[j] - '0');
        }
    }
 
    int ansLen = aLen + bLen - 1;
    for (int i = ansLen - 1; i > 0; i--) {
        ans[i - 1] += ans[i] / 10;
        ans[i] %= 10;
    }
 
    // 정답 출력
    for (int i = 0; i < ansLen; i++) {
        printf("%d", ans[i]);
    }
    printf("\n");
}
 
int main() {
    char a[110], b[110];
    int aop, bop;
    while (1) {
        scanf("%s", a);
        // 0을 입력받은 경우 종료
        if (a[0] == '0') break;
        scanf("%s", b);
 
        // 곱해주는 수가 0인 경우
        if (b[0] == '0') {
            printf("0\n");
            continue;
        }
 
        aop = (a[0] == '-');
        bop = (b[0] == '-');
        if (aop + bop == 1) printf("-");
 
 
        // a, b가 음수인 경우 부호 다음 지점 부터 곱셈 연산되도록 인자 전달
        // ex) a의 1번, b의 1번 
        multi(a + aop, b + bop);
    }
    return 0;
}

 

반응형

댓글