배열에 큰 숫자를 나타내는 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;
}
}
'*'연산자를 먼저 오버로드해야한다고 생각합니다. – yizzlez