큰 수 연산

숫자가 매우 큰 경우에 사칙연산을 수행하는 경우 변수의 범위를 초과한다.

따라서 문자열로 치환해 연산을 수행해줘야 한다.

각 언어별 큰수연산(정수, 실수) 연산 지원은 다음과 같다.

언어 큰 정수 큰 실수
Java java.math.BigInteger java.math.BigDecimal
Python int decimal.Decimal
Javascript bigint  
C++ cpp_int (boost) cpp_dec_float (boost)

일반적으로 배열의 성질을 이용해 구한다.

덧셈

string bigNumberAdd(string a, string b) {
  int carry = 0;
  string result = "";

  while (!a.empty() || !b.empty() || carry) {
    if (!a.empty()) {
      carry += a.back() - '0';
      a.pop_back();
    }

    if (!b.empty()) {
      carry += b.back() - '0';
      b.pop_back();
    }

    result += ((carry % 10) + '0');
    carry /= 10;
  }

  reverse(result.begin(), result.end());
  return result;
}

뺄셈

bool isSmaller(string a, string b) {
  int lengthA = a.length(), lengthB = b.length();

  if (lengthA < lengthB) {
    return true;
  }
  if (lengthB < lengthA) {
    return false;
  }

  for (int i = 0; i < lengthA; i++)
    if (a[i] < b[i]) {
      return true;
    } else if (a[i] > b[i]) {
      return false;
    }

  return false;
}

string bigNumberSub(string str1, string str2) {
  if (isSmaller(str1, str2)) {
    swap(str1, str2);
  }

  string result = "";
  int n1 = str1.length(), n2 = str2.length();

  reverse(str1.begin(), str1.end());
  reverse(str2.begin(), str2.end());

  int carry = 0;

  for (int i = 0; i < n2; i++) {
    int sub = ((str1[i] - '0') - (str2[i] - '0') - carry);

    if (sub < 0) {
      sub = sub + 10;
      carry = 1;
    } else
      carry = 0;

    result += (sub + '0');
  }

  for (int i = n2; i < n1; i++) {
    int sub = ((str1[i] - '0') - carry);

    if (sub < 0) {
      sub = sub + 10;
      carry = 1;
    } else {
      carry = 0;
    }

    result += (sub + '0');
  }

  reverse(result.begin(), result.end());
  return result;
}

+ Recent posts