математика — код BigNum в переполнении стека

я написал этот код для работы с большим целым числом:
функция суммы работает правильно, но функция множественного числа не работает.
Может ли кто-нибудь помочь мне решить мою проблему?

0

Решение

Мне кажется, вы сначала сохраняете младшую цифру цифр.
Затем этот последний цикл выглядит так, как будто он должен повторяться в обратном направлении, то есть с первой, наименее значащей цифры, и добавить символ вставки в Mul[i+1] скорее тогда Mul[i+1],

for(int i=m;i>0;i--)
{
if(Mul[i]>9)
{
Mul[i-1]+=Mul[i]/10;
Mul[i]%=10;
}
}

Это, однако, все еще не достаточно, так как даже последняя цифра, Mul[m], все еще может получить больше 9, поэтому вам нужно продолжить мимо него.

Однако ваш код может быть значительно упрощен.

Mul[i+j]+=(Num1[i]*Num2[j]+temp)%10;
temp=(Num1[i]*Num2[j]+temp)/10;

После этого вы, возможно, Mul[i+j] более 9, поэтому требуется (в настоящее время не удается) постобработка. Вы можете изменить это, чтобы взять остаток от всей суммы, следовательно, оставив Mul[i+j] всегда меньше 10.

void mul() {
int s1 = c1.size(), s2 = c2.size();
for (i = 0; i < s1; ++i) {
int temp = 0;
// note the condition - this ensures the cycle continues past i+s2
// as long as there is some remainder (assumes same length of Num2 and Mul)
for (j = 0; j < s2 || temp != 0; ++j) {
// add the current multiple and the remainder to the digit
Num[i + j] += Num1[i] * Num2[j] + temp;
// take the remainder from the whole sum, not only the added part
// this way Mul[i + j] < 10, therefore you don't need any postprocess
temp = Mul[i + j] / 10;
Num[i + j] %= 10;
}
}
}

Кроме того, вам не нужно хранить Remander в tempВы можете напрямую добавить его в Mul[i+j+1]в любом случае это будет позаботиться на следующей итерации.

1

Другие решения

Других решений пока нет …