2016-12-12 7 views
0

최근에 BigInteger 클래스를 만들려고했습니다. 지금, 나는 프로토 타입을하고 있었고 거의 작동했습니다. 이 프로토 타입은 함수가 아니며 클래스도 아니며, 그것이 작동하는지 보았습니다. BigInteger 구현에서 불일치가 발생했습니다.

이 지금까지 내 프로토 타입입니다 :

std::vector<long long unsigned> vec1 {4294967295, 2294967295, 1294967295}; 
    std::vector<long long unsigned> vec2 {4294967295, 2294967295, 1294967295}; 

    int carry {}; 
    for (int i {static_cast<int>(vec1.size()) - 1}; i != -1; --i) { 
     int unsigned greater = static_cast<unsigned int>(std::max(vec1[i], vec2[i])); 
     int unsigned result {}; 

     if (i < static_cast<int>(vec2.size())) { 
      result = static_cast<int unsigned>(vec2[i] + vec1[i] + carry); 
     } else if (carry) { 
      result = static_cast<int unsigned>(vec1[i] + carry); 
     } else { 
      break; 
     } 

     if (result <= greater) { 
      vec1[i] += result; 
      carry = 1; 
     } else { 
      vec1[i] = result; 
      carry = 0; 
     } 
    } 

    if (carry) { 
     vec1.back() += 1; 
    } 

    for (auto const n : vec1) { 
     cout << n; 
    } 

를 (그냥 컴파일러를 기쁘게하는 모든 캐스트와 조금 추한 모습) 그리고 이러한 결과입니다, 무엇을 그래서

858993459025899345892589934591 
       ^  ^
858993459045899345902589934590 -> the correct one! 

내가 잘못하고있어?

gcc 및 visual studio에서 동일한 결과를 얻습니다.

+0

호기심, 왜 "int unsigned greater"를 사용하는 반면 vec1과 vec2는 "long long unsigned"입니까? –

+0

이 코드를 호출하거나 결과를 표시하는 방법이 명확하지 않기 때문에 [MCVE] (https://stackoverflow.com/help/MCVE)가 아닙니다. 정확하고 잘못된 결과를 재현 할 수있는 충분한 코드를 제공해주십시오. 완전히 쓸모가있는 것은 아니지만 문제가없는 경우를 대비하여 내가 본 것을 언급하는 동안 이것을 언급 할 것이라고 생각했습니다. – ShadowRanger

+0

그 xD에 대해서 생각조차하지 않았다. 그것은 물건의 작동 방식을 보았던 프로토 타입 일 뿐이었다. 갑작스럽게 끝난다면 –

답변

0

if (carry) { 
    vec1.back() += 1; 
} 

마지막 빈 하나 추가합니다.

아마 앞면에 삽입하고 싶습니까?

1

하는 서면 가장 높은 크기 또한 운반하는 경우, 당신은 가장 낮은 크기 값 증가 끝으로 : 아마도

if (carry) { 
    vec1.back() += 1; 
} 

을, 올바른 동작은 새를 차지 캐리를 벡터를 확장 할 수 있도록 할 것입니다 최고 값, 예를 들면 :

if (carry) { 
    vec1.insert(vec1.begin(), 1); 
} 

이 (A vector의 시작 부분에 삽입 저렴하지 않기 때문에, 모든 기존 값을 복사) 당신이, 또는 정확하지 않을 수있는 vec1을 확대하고 결국 의미 하는가 클래스의 디자인이 주어진 경우 (vec1vec2의 크기가 일치하지 않으면 추가 작업이 안전하지 않으므로 vec1의 확장이 허용되는지 여부가 불분명 함).

+1

나는 벡터 little endian을 정렬하는 것을 선호한다. 그래서 새로운 최상위 자릿수를 추가하는 것은'insert' 대신에'push_back'이다. http://stackoverflow.com/a/22004815/5987을 참조하십시오. –

+0

@MarkRansom : 필자가 알고있는 모든 다중 정밀도 정수 라이브러리는 리틀 엔디안 순서로 "단어"가있는 크기를 저장합니다. 필요할 때 훨씬 쉽기 때문입니다. 캐리로 인해 확장 할 수 있습니다.또한, 메모리를 순차적으로 읽고 쓰는 중이다. 이는 일부 아키텍처에서 유용 할 수 있으며 그렇지 않은 경우에도 일반적으로 코드 작성이 더 쉽다는 것을 의미한다. – ShadowRanger

+0

눈에 잘 띄면 앞면이 잘 형성되고 벡터의 뒷면에 문제가 발생합니다. 불일치가 발생한 지점을 명확하게 보여주기 위해 편집했습니다. 또한, for 루프가 반대임을 주목하십시오. –