Число - простой математический объект, является базовым при построении более сложных объектов. Как правило, для хранения числа в программе нужно выделить одну переменную. Многие языки программирования различают переменные по типам и по точности.
В бейсике "МК 85" всего один тип числовых переменных - действительные с плавающей точкой (есть также строки символов). На одну переменную расходуется 8 байт памяти, которые позволяют закодировать 12 десятичных разрядов мантиссы и порядок в диапазоне +4096. 2 младших разряда мантиссы на дисплей не выводятся и называются скрытыми. Благодаря им выводимое число всегда корректно округлено, и ситуация, когда 1 отображается как 0.9999999999, практически исключена.
Арифметические операции над действительными числами, поддерживаемые бейсиком:
A+B - сложение; A-B
- вычитание;
A*B - умножение; A/B
- деление.
Во встроенных математических функциях бейсика как аргумент, так и значение являются действительными числами. В некоторых операторах бейсика числовые параметры предполагаются целыми. В этих случаях происходит автоматическое округление числа до ближайшего целого.
Бейсик "Электроники МК 85" дает возможность проводить следующие операции сравнения
чисел:
A¦B
- A не равно B; A=B
- A равно B;
A<B - A меньше B; A≤B
- A не больше B;
A>B - A больше B; A≥B
- A не меньше B.
Эти операции разрешены только в операторе IF, который является арифметическим, а не логическим, как в стандартном бейсике.
Для организации логической переменной приходится использовать либо числовую (A), либо символьную ($, A$) переменную бейсика. Переменную, играющую роль логической, называют флагом. Операцию A=1 называют выставить флаг, операцию A=0 - сбросить флаг, IF A=1; - проверка.
Принимают всего два значения: 0 и 1. В одной переменной программы может храниться в упакованном виде до 50 таких чисел. Однако в "Библиотеке" нет ни одной программы, работающей с бинарными матрицами, так как их упаковка и распаковка - слишком трудоемкие операции.
Для хранения комплексного числа используется пара действительных переменных. Справедливы две формы определения комплексного числа: алгебраическая Z=A+jB и тригонометрическая Z=rejq, где j=Ц-1, A=Re Z - действительная часть, B=Im Z - мнимая часть, r- модуль, q - фаза.
Процедуры перевода числа из тригонометрической формы в алгебраическую и обратно:
RAD :A=C*COS D:B=C*SIN D
RAD :C=SQR (A*A+B*B):D=ASN (B/C)
Здесь C - r¦0, D - q.
Арифметические операции над комплексными числами в алгебраической форме:
A=C+E:B=D+F - сложение;
A=C*E-D*F:B=C*F+E*D -
умножение;
B=E*E+F*F:A=(C*E+D*F)/B:B=(D*E-C*F)/B
- деление;
где (A,B) - результат,
(C,D),(E,F)
- операнды.
Число состоит из нескольких разрядов, между которыми определено старшинство. Количество возможных комбинаций разряда называют основанием числа. Одно и то же число может иметь разные формы записи в зависимости от используемого основания. Во многих диалектах бейсика предусмотрена возможность вводавывода чисел в форме двоичного, восьмеричного и шестнадцатиричного. В бейсике "МК 85" допустим только десятеричный формат.
Преобразование десятеричного числа в число с другим основанием проводится по формуле:
d = е(i)eimi, i=l...h
где d - десятеричное число;
h - номер старшего ненулевого разряда;
l - номер младшего значимого разряда;
m - основание;
ei - значение i-го разряда числа с основанием m (0≤ei<m).
Программа 1. Перевод произвольного числа в десятеричное.
10 D=0:INPUT "m",A,"h",B,"l",C:FOR
B=B TO C STEP -1:PRINT B;
20 INPUT E:D=D+E*A-B:NEXT B:PRINT D:GOTO
10
Размер: 64, E
Пример: m=100; h=2; l=-1; e2=45; e1=28; e0=81; e-1=32.
Ответ: d=452881,32.
Программа 2. Перевод десятеричного числа в число с требуемым основанием.
10 INPUT "d",D,"m",A:B=INT (LOG
D/LOG A+1):E=B-10/LOG A
20 C=INT (D/A-B):IF C>0;PRINT B;C:D=D-C*A-B
30 B=B-1:IF D"`0;IF B>E THEN 20
Размер: 92, E
Пример: d=452881,32; m=100.
Ответ: e2=45; e1=28; e0=81; e-1=32.
Программа 3. Перевод десятеричного числа в число с основанием от 2 до 16. Значения от 10 до 15 выводятся на дисплей буквами от A до F.
10 INPUT "d",D,"m",A:B=INT (LOG
D/LOG A):E=B-10/LOG A
20 C=INT (D/A-B):D=D-C*A-B:IF
C>9;C=C+7
30 PRINT CHR (48+C);:B=B-1:IF B≥0 THEN 20
40 IF D¦0;IF B>E THEN 60
50 GOTO 10
60 IF B=-1;PRINT ".";
70 GOTO 20
Размер: 137, E
Пример: d=63; m=16.
Ответ: Hex d=3F.
В результате деления A на B получаются частное D и остаток R такие, что R<B и B*D+R=A. Если R=0, то говорят, что A кратно B. Натуральное число, которое делится только на само себя и на 1, называют простым.
Программа 4. Наибольший общий делитель двух чисел.
10 INPUT A,B
20 C=A:D=INT (B/A):A=B-D*A:IF A¦0;B=C:GOTO 20
30 PRINT C:GOTO 10
Размер: 52, D
Пример: 625; 1225.
Ответ: НОД(625;1225)=25.
Программа 5. Разложение числа на простые сомножители.
10 B=2:INPUT A
20 IF A<B*B;PRINT A:GOTO 10
30 C=A/B:IF INT C=C;A=C:PRINT B:GOTO 30
40 B=B+1:IF B>3;B=B+1
50 GOTO 20
Размер: 75, C
Пример: 1234567890.
Ответ: 2; 3; 3; 5; 3607; 3803.
Программа 6. Наименьшее общее кратное двух чисел.
10 INPUT A,B:E=1:D=2
20 IF A=1;IF B=1;PRINT E:GOTO 10
30 F=0:C=A/D:IF INT C=C;A=C:F=1
40 C=B/D:IF INT C=C;B=C:F=1
50 IF F=1;E=E*D:GOTO 30
60 D=D+1:IF D¦3;D=D+1
70 GOTO 20
Размер: 124, F
Пример: 45; 125.
Ответ: НОК(45;125)=1125.
Программа 7. Наибольший общий делитель нескольких чисел.
10 INPUT "n",A:C=1:D=1:FOR B=1 TO
A:PRINT B;:INPUT D(B):NEXT B
20 FOR B=1 TO A:IF D(B)≤D;PRINT C:GOTO 10
30 NEXT B:D=D+1:IF D>3;D=D+1
40 FOR B=1 TO A:IF FRAC (D(B)/D)¦0 THEN 20
50 NEXT B:C=C*D:FOR B=1 TO A:D(B)=D(B)/D:NEXT B:GOTO 40
Размер: 145, D(n)
Пример: n=3; m1=45; m2=125; m3=225.
Ответ: НОД(45;125;225)=5.
Программа 8. Наименьшее общее кратное нескольких чисел.
10 INPUT "n",A:C=1:D=1
20 FOR B=1 TO A:PRINT B;:INPUT F(B):NEXT B
30 FOR B=1 TO A:IF F(B)>1 THEN 50
40 NEXT B:PRINT C:GOTO 10
50 D=D+1:IF D>3;D=D+1
60 F=0:FOR B=1 TO A:E=F(B)/D:IF INT E=E;F(B)=E:F=1
70 NEXT B:IF F=0 THEN 30
80 C=C*D:GOTO 60
Размер: 154, F(n)
Пример: n=3; m1=45; m2=125; m3=225.
Ответ: НОК(45;125;225)=1125.
Программа 9. Число перестановок. Расчетная формула:
n! = Хi, i=1...n
10 INPUT A:B=1:FOR C=1 TO A:B=B*C:NEXT C:PRINT B:GOTO 10
Размер: 32, C
Пример: n=5.
Ответ: 5!=120.
Примечание: Программа дает правильный ответ и при n=0.
Программа 10. Число размещений.
Amn=n! / (n-m)!
10 INPUT "n",A,"m",B:C=1:D=A-B
20 D=D+1:IF D≤A;C=C*D:GOTO 20
30 PRINT C:GOTO 10
Размер: 57, D
Пример: n=8; m=5.
Ответ: A58=6720.
Примечание: Алгоритм не повторяет приведенную выше формулу. Прямое ее копирование привело бы к увеличению затрат памяти, дополнительной погрешности вычислений, большей трудоемкости и более узкому диапазону допустимых n.
Программа 11. Число сочетаний (биномиальные коэффициенты).
Cmn=n! / m! / (n-m)!
10 INPUT "n",A,"m",B:C=1:D=B
20 D=D+1:IF D≤A;C=C*D/(A-D+1):GOTO 20
30 PRINT C:GOTO 10
Размер: 63, D
Пример: n=8; m=5.
Ответ: C58=56.
Примечание: Использование вместо оператора D=B последовательности D=A-B:IF D<B;D=B улучшает быстродействие алгоритма при m < n/2.
В основе любого итерационного (многошагового) алгоритма лежит представление о некоторой последовательности
{xi}, i=0,1,2,3,...
где xi - член последовательности,
i - его порядковый номер.
Программа 12. Последовательность простых чисел.
Алгоритм относится к классу переборных: искомая последовательность получается путем поэлементного отсеивания членов базовой последовательности. Попытки как-то сузить область перебора получили название метода решета. В программе использовано самое примитивное решето, исключающее из рассмотрения все четные числа после двойки.
10 PRINT 2:A=1
20 A=A+2:B=3
30 IF A<B*B;PRINT A:GOTO 20
40 IF FRAC (A/B)=0 THEN 20
50 B=B+2:GOTO 30
Размер: 64, B
Ответ: 2; 3; 5; 7; ...
Программа 13. Последовательность чисел Бернулли. Расчетная формула:
B0=1; Bk=1/(k+1) е(i)Bi (k+1)! / (k+1-i) / i!, i=1 ... k-1
Этот алгоритм относится к нерекуррентным, так как для вычисления нового члена последовательности используются все предыдущие.
10 E=1:A=1
20 A=A+1:D(A)=0:C=1/A:B=0
30 B=B+1:D(A)=D(A)-C*D(B):IF B<A-1;C=C*(A-B+1)/B:GOTO 30
40 PRINT A-1;D(A):GOTO 20
Размер: 101, E(k)
Ответ: B1=-1/2; B2=1/6; B3=0; ...
Программа 14. Последовательность s-чисел Фибоначчи.
Mi=1, i=0...s;
Mi+1=Mi+Mi-s,
i>s.
Типичный рекуррентный алгоритм. Для вычисления нового члена последовательности необходимо помнить лишь s последних членов.
Как правило, мы имеем дело с рекуррентными алгоритмами.
10 INPUT A:FOR B=0 TO A:D(B)=1:NEXT
B
20 E(A)=D(A)+D:PRINT D;:FOR B=0 TO A:D(B)=E(B):NEXT B:GOTO 20
Размер: 64, E(s)
Пример: s=1.
Ответ: M0=1; M1=1; M2=2; M3=3; M4=5; ...
Сортировка сводится к упорядочиванию некоторого перечислимого числового множества по возрастанию (убыванию) его членов:
{xi}, xi+1 ≥ xi, i=1 ... n-1
Программа 15. Метод "пузырька". Программа переставляет индексы r исходного массива чисел er так, чтобы числа er(i) расположились в порядке возрастания по i.
10 INPUT "n",A:FOR B=1 TO A:C=B*2:PRINT
B;
20 INPUT E(C):D(C)=C:NEXT B:FOR B=2 TO A:C=B*2
30 C=C-2:IF E(D(C))≤E(F(C)) THEN 50
40 D=D(C):D(C)=F(C):F(C)=D:IF C>2 THEN 30
50 NEXT B:FOR B=1 TO A:PRINT B;D(B+B)/2:NEXT B
Размер: 146, F(2*n)
Пример: n=4; e1=103; e2=17; e3=67; e4=25.
Ответ: r1=2; r2=4; r3=3; r4=1.
Примечание: Для упорядочивания по убыванию измените знак отношения в строке 30 на ≥.