1. Числа


1.0. Введение

Число - простой математический объект, является базовым при построении более сложных объектов. Как правило, для хранения числа в программе нужно выделить одну переменную. Многие языки программирования различают переменные по типам и по точности.

1.0.1 Действительные числа

В бейсике "МК 85" всего один тип числовых переменных - действительные с плавающей точкой (есть также строки символов). На одну переменную расходуется 8 байт памяти, которые позволяют закодировать 12 десятичных разрядов мантиссы и порядок в диапазоне +4096. 2 младших разряда мантиссы на дисплей не выводятся и называются скрытыми. Благодаря им выводимое число всегда корректно округлено, и ситуация, когда 1 отображается как 0.9999999999, практически исключена.

Арифметические операции над действительными числами, поддерживаемые бейсиком:
A+B - сложение; A-B - вычитание;
A*B - умножение; A/B - деление.

Во встроенных математических функциях бейсика как аргумент, так и значение являются действительными числами. В некоторых операторах бейсика числовые параметры предполагаются целыми. В этих случаях происходит автоматическое округление числа до ближайшего целого.

1.0.2 Логические переменные

Бейсик "Электроники МК 85" дает возможность проводить следующие операции сравнения чисел:
A¦B - A не равно B; A=B - A равно B;
A<B - A меньше B; A≤B - A не больше B;
A>B - A больше B; AB - A не меньше B.

Эти операции разрешены только в операторе IF, который является арифметическим, а не логическим, как в стандартном бейсике.

Для организации логической переменной приходится использовать либо числовую (A), либо символьную ($, A$) переменную бейсика. Переменную, играющую роль логической, называют флагом. Операцию A=1 называют выставить флаг, операцию A=0 - сбросить флаг, IF A=1; - проверка.

1.0.3 Бинарные числа

Принимают всего два значения: 0 и 1. В одной переменной программы может храниться в упакованном виде до 50 таких чисел. Однако в "Библиотеке" нет ни одной программы, работающей с бинарными матрицами, так как их упаковка и распаковка - слишком трудоемкие операции.

1.0.4 Комплексные числа

Для хранения комплексного числа используется пара действительных переменных. Справедливы две формы определения комплексного числа: алгебраическая 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) - операнды.

1.1. Числа с произвольным основанием

Число состоит из нескольких разрядов, между которыми определено старшинство. Количество возможных комбинаций разряда называют основанием числа. Одно и то же число может иметь разные формы записи в зависимости от используемого основания. Во многих диалектах бейсика предусмотрена возможность вводавывода чисел в форме двоичного, восьмеричного и шестнадцатиричного. В бейсике "МК 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.

1.2. Делимость натуральных чисел

В результате деления 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.

1.3. Комбинаторика

Программа 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.

1.4. Числовые последовательности

В основе любого итерационного (многошагового) алгоритма лежит представление о некоторой последовательности

{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; ...

1.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 на ≥.


Продолжить
К Оглавлению

Сайт управляется системой uCoz