Я написал этот код для работы с большим целым числом:
функция sum работает корректно, но множественная функция не работает.
Может ли кто-нибудь помочь мне исправить мою проблему?
Мне кажется, что вы сначала запоминаете цифры наименьшей значащей цифры. Затем этот последний цикл выглядит так, что он должен перебирать противоположный путь, т.е. От первой - младшей значащей цифры, и добавить ремандер в 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]
, в любом случае его будет позаботиться и на следующей итерации.