| [ QuizWit ] in KIDS 글 쓴 이(By): artist (예술인) 날 짜 (Date): 1998년 7월 21일 화요일 오후 10시 29분 16초 제 목(Title): Re: [수식계산] 소스 올립니다... 먼저 *byte를 사용하는 것보다는 정수형을 묶는게 더 좋을 것 같습니다. struct 엄청나게큰정수 { int 자리수; // 자리수에 3자리수면 3을 4자리수이면서 음수면 -4를 넣습니다. // 숫자크기 비교가 왠만하면 이걸로 끝납니다. *int 실제숫자; // 이건 long long int를 쓸 수 있으면 그걸 쓰고 // 대충 만든다면 아예 int[100]정도로 미리 정해놓으면 정말 편해질겁니다. }; gmp에서 이부분을 대충 보니까 실제숫자부분이 몇개가 사용됐는지 기록하는 변수도 있더군요. 숫자를 저장하는 방식은 32bit 정수형이라면 +-21억까지 쓸 수 있지만 8자리씩 나눠서 저장 하는 것이 제가 생각한 방법의 핵심입니다. 더하기를 예로 들자면 for (대충 적당히) 답.실제숫자[i] = 큰정수1.실제숫자[i] + 큰정수2.실제숫자[i]; 이렇게 해서 계산을 한다음 반복문을 한번 더 돌려서 for (알아서 잘) if (답.실제숫자[i] > 99999999) { 답.실제숫자[i] -= 99999999; 답.실제숫자[i+1] += 1; }; 실제숫자는 0에서 99999999사이가 되도록 답을 정리합니다. 빼기일 경우에는 실제숫자가 음수가 되지 않도록 확인하고요. 빼기도 이방법으로 하기위해서 실제숫자는 signed int여야 합니다. 이런식으로 하면 abs, +, -, 크기비교 까지는 바로 나오겠네요. 만들기도 쉽고 계산도 그럭저럭 빠를테고. 다음은 곱하기. 이것도 위의 방법을 응용해서 실제숫자에는 곱하기9를 할 수 있는 공간이 있으니까. 실제숫자에 한자리씩 곱한다음 정리하고 이걸 반복하는 식이면 될것 같군요. 나누기는 에고.. 안하면 안되나.. double로 바꿔 몫을 예상한 다음 곱한 후 더하거나 빼가면서 조절하면 어떨까요? 더 좋은 생각이 있으신 분은 알려주세요. |