2014-02-21 3 views
1

배열에 큰 숫자를 나타내는 bigint 클래스를 만들려고하지만이 bigint에 다른 bigint를 곱하는 *= 멤버 함수를 만드는 데 문제가 있습니다. 나는 이미 이것을 달성하는 수업이 있다는 것을 알고 있지만, 나는 학습 훈련으로 자신을 구축하려고 노력하고 있습니다.배열로 표시된 정수 곱하기

biguint의 자릿수는 배열 std::size_t data[CAPACITY]에 저장되고 최하위 숫자는 data[0]에 저장되고 최상위 숫자는 data[CAPACITY-1] (리틀 엔디안)에 저장됩니다. 예를 들어 CAPACITY=5 인 경우 12345는 data[0]=5, data[1]=4, data[2]=3, data[3]=2, data[4]=1으로 표시됩니다.

나는 생성자, 추가 함수, 크기 함수, << 연산자 함수, >> 연산자 함수 및 [] 연산자 함수를 성공적으로 빌드했습니다. 예를 들어 다음 코드가 작동합니다. 곱셈 문제 상에,

2786 
4 

이 내가 함께 왔어요 가장 가까운 기능입니다 :를 출력이

int main() 
{ 
    biguint b(423); 
    biguint c(2363); 
    b += c; 
    cout << b << endl; 
    cout << b.size() << endl; 

    return 0; 
} 

. 정확하게 400 * 2와 같은 bigints를 계산할 수 있지만 data[i]을 다시 작성하기 때문에 bigints는 400 * 20과 같이 실패합니다.

void bigint::operator *= (const bigint &n) 
{ 
    int carryover = 0; 
    for (size_t i=0; i < size(); ++i) 
    { 
     for (size_t j=0; j < n.size(); ++j) 
     { 
      std::cout << data[i] << "*" << n[j] << "="; 
      data[i] *= n[j]; 
      std::cout << data[i] << std::endl; 
     } 
    } 
} 

이 같은 긴 곱셈을 할 노력하고있어 :

109 
* 12 
____ 
    218 
+1090 
_____ 
1308 

나는 새로운 BIGINT를 생성하는 것이 작업을 수행 할 수있는 올바른 방법을 생각하지만 오류, lvalue required as left operand of assignment 받고 있어요, 이 같은 것을 시도 할 때 :

void bigint::operator *= (const biguint &n) 
{ 
    int carryover = 0; 
    bigint ans(0); 
    for (size_t i=0; i < size(); ++i) 
    { 
     for (size_t j=0; j < n.size(); ++j) 
     { 
      ans[j] += data[i] * n[i]; 
      ans[j] += carryover; 
      carryover = ans[j]/10; 
      ans[j] = ans[j] % 10; 
     } 
    } 
} 

내가 뭘 잘못하고 있니? 내 접근 방식이 맞습니까? 리틀 엔디 언 배열로 저장된 두 숫자를 곱하는 올바른 방법은 무엇입니까?

참고로, 이것은 내가 += 연산자를 코딩 한 것입니다. 나는 기본적으로 초등 학생을 손으로 추가하고있다.

void bigint::operator += (const biguint &n) 
{ 
    int carryover = 0; 
    for (size_t i=0; i < CAPACITY; ++i) 
    { 
     data[i] += n[i]; 
     data[i] += carryover; 
     carryover = data[i]/10; 
     data[i] = data[i] % 10; 
    } 
} 
+0

'*'연산자를 먼저 오버로드해야한다고 생각합니다. – yizzlez

답변

0

나는 느리고 비효율적 인 방법으로 문제를 해결했다. 나는 그 자체에 첫 번째 숫자를 두 번째 횟수만큼 추가한다. <, >, or ++ 연산자를 아직 작성하지 않았으므로 구문이 약간 이상합니다. 내가 지금 당장 가지고있는 유일한 구현이기 때문에 나는이 구현을 고수 할 것이다.

void biguint::operator *= (const biguint &n) 
{ 
    biguint temp(*this); 
    biguint i(1); 
    biguint one(1); 

    while (i.compare(n) != 0) 
    { 
     *this += temp; 
     i += one; 
    } 
}