#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;

}










포인터랑 구조체랑 문자열이랑 함수랑 조합하면 경우의 수가 몇가지여;;;..,.... ㅠㅠ