큰 수 연산
숫자가 매우 큰 경우에 사칙연산을 수행하는 경우 변수의 범위를 초과한다.
따라서 문자열로 치환해 연산을 수행해줘야 한다.
각 언어별 큰수연산(정수, 실수) 연산 지원은 다음과 같다.
언어 | 큰 정수 | 큰 실수 |
---|---|---|
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;
}
'공부 > 알고리즘 문제풀이' 카테고리의 다른 글
백준.12852.1로 만들기 2 (0) | 2021.01.25 |
---|---|
백준.1197.최소 스패닝 트리 (0) | 2021.01.24 |
삼성 7699. 수지의 수지 맞는 여행 (0) | 2019.12.31 |
삼성 9088. 다이아몬드 (0) | 2019.12.27 |
삼성 8458. 원점으로 집합 (0) | 2019.12.03 |