>
Перша задача. Ввести "довге число" з файлу. Рішення задачі почнемо з опису даних.
Const MaxDig=1000; {Максимальна кількість цифр – чотиризначних}
Osn=10000; {Основа системи числення, в елементах масиву – чотиризначні числа}
Type Tlong=Array[0..MaxDig] Integer;
Алгоритм введення "довгого числа" з файлу розглянемо на прикладі.
А[0] |
А[1] |
А[2] |
А[3] |
ch |
Примітка |
3 |
674 |
851 |
23 |
- |
Кінцевий стан |
0 |
0 |
0 |
0 |
2 |
Початковий стан |
1 |
2 |
0 |
0 |
3 |
1-й крок |
1 |
23 |
0 |
0 |
8 |
2-й крок |
1 |
238 |
0 |
0 |
5 |
3-й крок |
2 |
385 |
2 |
0 |
1 |
4-й крок: старша цифра елемента А [1] перейшла в поки "порожній елемент" А[2] |
2 |
851 |
23 |
0 |
6 |
5-й крок |
2 |
516 |
238 |
0 |
7 |
6-й крок |
3 |
167 |
385 |
2 |
4 |
7-й крок |
3 |
574 |
851 |
23 |
|
|
Нехай у файлі записано число 23851674 і основою (Osn) є 1000 (зберігаємо по три цифри в елементі масиву А). Зміна значень елементів масиву А під час введення (посимвольного в змінну ch) відображено в таблиці 2
Проаналізуємо таблицю.
1. В А[0] зберігаємо кількість задіяних (ненульових) елементів масиву А.
2. При обробці кожної чергової цифри вхідного числа старша цифра елемента масиву з номером i стає молодшою цифрою числа в елементі i+1, а цифра, що вводиться, буде молодшою цифрою числа з А[1]. В результаті роботи алгоритму отримали число, записане задом наперед.
Примітка: Напишемо фрагмент тексту процедури перенесення старшої цифри з А[i] в молодшу цифруА[i+1], тобто зсув вже введеної частини числа на одну позицію вправо:
For i:=A[0] DownTo 1 Do Begin
А[i+l]:=A[i+l]+(Longint(А[i])*10) Div Osn;
А[i]:=(LongInt(А[i])*10) Mod Osn;
End;
Нехай вводиться число 23851674 і перші 6 цифр вже розмістили ззаду наперед в масиві А. В символьну змінну ch читали чергову цифру "довгого числа" – це "7". За алгоритмом ця цифра "7" має бути розміщена молодшою цифрою в А[1]. Наведений фрагмент програми "звільняє" місце для цієї цифри. В таблиці відображені результати роботи цього фрагменту.
i |
А[1] |
А[2] |
А[3] |
ch |
2 |
516 |
238 |
0 |
7 |
2 |
516 |
380 |
2 |
|
1 |
160 |
385 |
2 |
|
Після цього залишається тільки додати поточну (зчитану в ch) цифру "довгого числа" до А[1] і змінити значення А[0].
Зрештою процедура повинна мати наступний вигляд:
Procedure ReadLong(Var А:Tlong);
Var ch:char;i:Integer;
Begin
FillChar(A,SizeOf(A),0);
Read(ch);
While Not(ch In ['0'..'9']) Do Read(ch);
{пропускання не цифр у вхідному файлі}
While ch In ['0'..'9'] Do
Begin
For i:=A[0] DownTo 1 Do
Begin
{перенесення старшої цифри в числі з A[i] в молодшу цифру числа з А[i+l]}
А[i+l]:=A[i+l]+(LongInt(А[i])*10) Div Osn;
A[i]:=(LongInt(А[i])*10) Mod Osn;
End;
А[1]:=A[l]+Ord(ch)-Ord('0');
{додаємо молодшу цифру до числа з А[1]}
If А[А[0]+1]>0 Then Inc(А[0]);
{змінюємо довжину, кількість задіяних елементів масиву А}
End;
End;
Друга задача. Виведення "довгого числа" у файл або на екран.
Нехай в елементах масиву зберігаються чотиризначні числа. Тоді "довге число" 128400583274 буде в масиві А представлено таким чином:
А[0] |
А[1] |
А[2] |
А[3] |
3 |
3274 |
58 |
1284 |
При виведенні "довгого числа" з масиву нам необхідно вивести 0058, інакше буде втрата цифр. Отже, незначущі нулі також необхідно виводити. Процедура виведення має вигляд:
Procedure WriteLong(Const А:Tlong);
Var Is,s:String;
i:Integer;
Begin
Str (Osn Div 10,Is) ;
Write(A[А[0]];{виводимо старші цифри числа}
For i:=A[0]-l DownTo 1 Do
Begin
Str(А[i],s);
While Length(s)<Length(Is) Do s:='0'+s;
{доповнюємо незначущими нулями}
Write (s) ;
End;
Writeln;
End;