і, десятки, сотні, і т.д.).
Крім того, всі операції будуть реалізовані таким чином, що після виконання будь-якої з них лідируючі нулі (тобто зайві нулі на початку числа) відсутні (зрозуміло, в припущенні, що перед кожною операцією лідируючі нулі також відсутні). Слід зазначити, що в представленій реалізації для числа нуль коректно підтримуються відразу два подання: порожній вектор чисел, і вектор чисел, що містить єдиний елемент - нуль.
невід'ємне ціле число N довжини n так само можна представити у вигляді:
,
де Base - основа системи числення, всі коефіцієнти.
Наприклад, число 12345 10 в цій інтерпретації буде має вигляд:
.
Довге число зберігається в масиві, де i-й елемент відповідає коефіцієнту числа при Base i. Як приклад, розглянемо масив для 12345 10: (5, 4, 3, 2, 1). Як видно, цифри зберігаються в зворотному порядку. Основа системи числення Base залежить від максимального розміру базового типу даних на комп'ютері і вибирається, виходячи з таких міркувань:
. Основа повинна підходити під один з базових типів даних.
. Base має бути якомога більше, щоб зменшити розмір уявлення довгого числа і збільшити швидкість операцій з ними, але досить малого розміру, щоб всі операції з коефіцієнтами використовували базовий тип даних.
. Для зручності можна вибрати Base як ступінь 10 (висновок інформації, налагодження). Base - ступінь двійки дозволяє проводити швидкі операції на низькому рівні.
У своїй програмі я використовувала інший метод для представлення великих чисел. Записувала числа типом string:
public void long_addition (string first_summand, string second_summand, ref string sum)
{
int dop=0;
sum=«»;
reverse (first_summand, ref first_summand);
reverse (second_summand, ref second_summand);
if (first_summand.Length> second_summand.Length)
{
second_summand=add_0 (first_summand, second_summand);
}
else
{
first_summand=add_0 (second_summand, first_summand);
}
for (int i=0; i
{
sum +=(int.Parse (first_summand [i]. ToString ()) + int.Parse (second_summand [i]. ToString ()) + dop)% 10;
dop=(int.Parse (first_summand [i]. ToString ()) + int.Parse (second_summand [i]. ToString ()) + dop) / 10;
if (i == first_summand.Length - 1 && dop!=0)
{
sum +=dop;
}
}
reverse (sum, ref sum);
}
5. Операції над довгими числами
Насамперед, необхідно уточнити інтерфейс. Можна визначити оператори як частини класу, і це буде досить зручно у використанні. Однак при обчисленні C=A + B оператор не зможе отримати доступ до числа C. Тому доведеться створювати тимчасове ч...