исло Temp=A + B, яке потім буде скопійовано в C. Зайвих операцій та використання додаткової пам'яті можна уникнути, якщо записувати результат в C безпосередньо . Виходячи їх цього, в якості інтерфейсу виберемо зовнішні функції, які приймають в якості параметрів вихідні дані і число для запису результату.
5.1 Додавання і віднімання
Схема для складання така: складаємо цифри зліва направо (цифри зберігаються у зворотному порядку). Якщо зафіксовано переповнення (тобто при додаванні отримана цифра, велика максимально можливої ??в даній системі числення), то відбувається «перенесення» (Carry) в наступний розряд.
Обчислення C=A + B, працює виклик виду Add (A, B, C). Максимальний розмір C повинен бути достатній для зберігання суми
void Add (BigInt A, BigInt B, ref BigInt C)
{i; temp;// Temp тут і далі грає роль «тимчасової» цифри,
/ / до виконання переносу. Можливо, temp> BASE .. Coef=new int [A.Size +1]; carry=0;
/ / Добиваємося B.Size? A.Size. (A.Size
{(B, A, ref C);;
}
/ / Тепер B.Size? A.Size.
/ / Складаємо два числа, i - номер поточної цифри (i=0; i
{= A.Coef [i] + B.Coef [i] + carry; (temp>=Base) / / переповнення. Перенести одиницю.
{. Coef [i]=temp - Base; carry=1;
}
{. Coef [i]=temp; carry=0;
}
}
/ / Менша кількість скінчилося (; i
{= A.Coef [i] + carry; (temp>=Base) / / переповнення. Перенести одиницю.
{. Coef [i]=temp - Base; carry=1;
}
{. Coef [i]=temp; carry=0;
}
}
/ / Якщо залишився перенос - додати його в додатковий розряд (carry == 1)
{. Coef [i]=carry; C.Size=A.Size + 1;
} C.Size=A.Size;
}
Віднімання здійснюється аналогічно, з тією лише різницею, що здійснюється перенесення «запозичення». Ми працюємо з позитивними числами, тому якщо від'ємник велике за розміром - відбувається вихід.
Якщо довжини однакові, але одне більше іншого - це призведе до того, що наприкінці процесу залишиться невикористане запозичення, а результат буде доповненням до Base B.Size. Наприклад, при звичайному відніманні 35 - 46=- 11, при описаному вище 35 - 46=89, так як виконується рівність 89=100 - 11 (89 - це доповнення 11 до 100).
Розглянемо випадок, коли обидва числа довгі. Зазвичай множаться числа послідовно на одну цифру за іншою, зберігаючи тимчасові результати. Потім тимчасові значення підсумовуються з урахуванням розряду. Однак можна нічого не зберігати, а відразу додавати до остаточного результату.
5.2 Множення
). Обнулити C.
2). Обнулити i.
3). Обчислити тимчасовий результат, відповідний множенню i-й цифри A на число B, в процесі обчислення відразу додавати його ...