QuizWit

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ 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로 바꿔 몫을 예상한 다음 곱한 후 더하거나 빼가면서 조절하면 어떨까요?

더 좋은 생각이 있으신 분은 알려주세요.

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.