#define _CRT_SECURE_NO_WARNINGS
#define carry_unit 1000
#include <stdio.h>
struct BigNum {
int i_digit[100]; // 정수 부분
int d_digit[100]; // 소수 부분
int i_total_digit; // 전체 사용되고 있는 정수부분 자리수
int d_total_digit; // 전체 사용되고 있는 소수부분 자리수
char sign; // 부호, 0 이면 양수, 1 이면 음수. 0 은 양수로 간주한다.
};
int initIntArr(int* ptr, int length) {
for (int i = 0; i < length; i++) {
*ptr = 0;
ptr++;
}
return 1;
}
int initBigNumAs0(struct BigNum* x) {
initIntArr(x->i_digit, 100);
initIntArr(x->d_digit, 100);
x->i_total_digit = 0;
x->d_total_digit = 0;
return 1;
}
struct BigNum bignum_sum(struct BigNum *a1, struct BigNum *a2) {
struct BigNum result;
int i;
int carry = 0;
int i_total_digit = (a1->i_total_digit) > (a2->i_total_digit) ? (a1->i_total_digit) : (a2->i_total_digit);
int d_total_digit = (a1->d_total_digit) > (a2->d_total_digit) ? (a1->d_total_digit) : (a2->d_total_digit);
int greater = -1;
initBigNumAs0(&result);
if (a1->sign && a2->sign) {
result.sign = a1->sign;
for (i = d_total_digit; i >= 0; --i) {
result.d_digit[i] = (a1->d_digit[i] + a2->d_digit[i] + carry) % carry_unit;
carry = (a1->d_digit[i] + a2->d_digit[i] + carry) / carry_unit;
}
for (i = 0; i < i_total_digit; ++i) {
result.i_digit[i] = (a1->i_digit[i] + a2->i_digit[i] + carry) % carry_unit;
carry = (a1->i_digit[i] + a2->i_digit[i] + carry) / carry_unit;
}
result.d_total_digit = d_total_digit;
result.i_total_digit = i_total_digit;
if (carry != 0 && i != i_total_digit) {
result.i_digit[i_total_digit] = carry;
result.i_total_digit = i_total_digit+1;
}
}
else {
for (i = i_total_digit; i >= 0; --i) {
if (a1->d_digit[i] == a2->d_digit[i]) {
continue;
}
else if (a1->d_digit[i] < a2->d_digit[i]) {
greater = 1;
break;
}
else {
greater = 0;
break;
}
}
if (greater == -1) {
for (i = 0; i < i_total_digit; ++i) {
if (a1->d_digit[i] == a2->d_digit[i]) {
continue;
}
else if (a1->d_digit[i] < a2->d_digit[i]) {
greater = 1;
break;
}
else {
greater = 0;
break;
}
}
}
if (greater == -1) {
result.i_total_digit = 0;
result.d_total_digit = 0;
return result;
}
if (greater) {
result.sign = a1->sign;
for (i = d_total_digit; i >= 0; --i) {
result.d_digit[i] = (a1->d_digit[i] - a2->d_digit[i] + carry + carry_unit) % carry_unit;
carry = (a1->d_digit[i] + carry > a2->d_digit[i])-1;
if (i == d_total_digit && result.d_digit[i] == 0)
--d_total_digit;
}
for (i = 0; i < i_total_digit; ++i) {
result.i_digit[i] = (a1->i_digit[i] - a2->i_digit[i] + carry + carry_unit) % carry_unit;
carry = (a1->i_digit[i] + carry > a2->i_digit[i]) - 1;
}
result.d_total_digit = d_total_digit;
result.i_total_digit = i_total_digit;
}
}
return result;
}
struct BigNum parse_BigNum(char* string) {
struct BigNum result;
int tmp = 0;
int d_digit = 0;
int i_digit = 0;
char* ptr;
initBigNumAs0(&result);
while (*string != 0 && *string != '.') {
++i_digit;
++string;
}
ptr = string;
while (*string) {
++d_digit;
++string;
if (*string == 0)break;
tmp = (int)(*string - 0x30);
++string;
if (*string == 0)break;
tmp = 10 * tmp + (int)(*string - 0x30);
++string;
if (*string == 0)break;
tmp = 10 * tmp + (int)(*string - 0x30);
result.d_digit[d_digit - 1] = tmp;
}
for (int i = 1; i+1 < i_digit; i+=3) {
tmp = int(*(ptr - i) - 0x30) + int(*(ptr - i - 1) - 0x30) * 10 + int(*(ptr - i - 2) - 0x30) * 100;
result.i_digit[i / 3] = tmp;
}
tmp = 0;
if (i_digit % 3 != 0) {
for (int i = 0; i < i_digit % 3; ++i) {
tmp = tmp * 10 + *(ptr - i_digit + i);
}
result.i_digit[i_digit / 3] = tmp;
}
return result;
}
int printBigNum(struct BigNum bn) {
printf("BigNum - 정수 자리 수 : %d, 소수 자리 수 : %d\n", bn.i_total_digit, bn.d_total_digit);
for (int i = bn.i_total_digit-1; i >= 0; --i) {
printf("%03d",bn.i_digit[i]);
}
printf(".");
for (int i = 0; i < bn.d_total_digit; ++i) {
printf("%03d", bn.d_digit[i]);
}
printf("\n");
return 0;
}
int bignum_sub() {
return 1;
}
int main() {
char numString[100] = "123.1234";
struct BigNum num1;
num1 = parse_BigNum(numString);
printBigNum(num1);
printf("%d",num1.d_total_digit);
return 0;
}
포인터랑 구조체랑 문자열이랑 함수랑 조합하면 경우의 수가 몇가지여;;;..,.... ㅠㅠ
참고로 저거 실행 가능하게 고쳐주신다면 신으로 모십니다... ㅎㅎ