Длинная арифметика - C (СИ)
Формулировка задачи:
Доброе время суток.
Я разбираю длинную арифметику. И есть некоторые вопросы.
К примеру возьмем Сложение.
Вот что оно выбивает после компиляции:
111+222= 3334
Не могу понять почему оно пишет 4, но в этом случаи у меня length=4.
Будьте добры помогите с окончанием.
int a[3], b[3], length, i=0, j=0, r=0;
int size_a, size_b;
// числа, которые будут сложиваться, предположительно записаны в массивы a и b
// НО они записаны “зеркально”.
// Размеры длин чисел хранятся в переменных size_a и size_b
//
printf("\n 1 masiv: \n");
for (i=0; i<3; i++) {
printf("\t");
scanf("%d", &a[i]);
}
size_a=i;
printf("\n size_a && i= %d", i);
//
printf("\n 2 masiv: \n");
for (j=0; j<3; j++) {
printf("\t");
scanf("%d", &b[j]);
}
size_b=j;
printf("\n size_b && j= %d", j);
// определяем длину массива суммы // a[4]; b[3]
if (size_a > size_b) // 4>3
length = size_a + 1; // length = 4+1=5
else
length = size_b + 1;
for (int ix = 0; ix < length; ix++) {
b[ix] += a[ix]; // суммируем последние разряды чисел
b[ix + 1] += (b[ix] / 10); // если есть разряд для переноса, переносим его в следующий разряд
b[ix] %= 10; // если есть разряд для переноса он отсекается
}
if (b[length - 1] == 0) // b[5-1]=4 != 0
length--; // => length=5
// число будет храниться в массиве b и выводить его следует с конца
printf("\n\n ");
for (r = 0; r < length; r++) {
printf("%d", b[r]);
}
getch();
}Решение задачи: «Длинная арифметика»
textual
Листинг программы
if (b[length - 1] == 0) * * * * * *// b[5-1]=4 != 0 * * * * length--; * * * * * * * * * * *// => length=5
Объяснение кода листинга программы
В данном коде выполняется следующие действия:
- Проверяется условие
b[length - 1] == 0. - Если условие истинно, то выполняется последовательность действий:
- Уменьшается значение переменной
lengthна единицу (length--;). - Проверяется условие
length != 0.
- Уменьшается значение переменной
- Если второе условие истинно, то выполняется следующая последовательность действий:
- Переменной
lengthприсваивается значение5(length = 5). - Выполняется последовательность действий, выделенная звездочками (
* * * * * * * * * *). Таким образом, код выполняет проверку последнего элемента массиваbна равенство нулю. Если это условие истинно, то длина массива уменьшается на единицу и проверяется на неравенство нулю. Если второе условие истинно, то длина массива устанавливается равной 5 и выполняется непонятная последовательность действий, выделенная звездочками.
- Переменной