По-цифровое извлечение квадратного корня - QBasic
Формулировка задачи:
Дано натуральное число. Требуется извлечь (вычислить)
по одной цифре квадратный корень. Алгоритм основан на
формуле
1. Согласно этой формуле, число разбивается по две цифры
справа налево.
2. Начальное значение числа а определяется сравнением с
квадратами чисел
3. После чего вычисляется каждая цифра b отдельно, одна за
другой.
Вопросы
1. Можно ли упростить прилагаемую программу?
2. Как обобщить данную программу на вещественные числа?
Листинг программы
- REM
- REM SQR(3000000) = 1732.0508
- REM
- CLS
- DIM d AS LONG
- DIM d2 AS LONG
- DIM sqrt AS LONG
- DIM a(9) AS LONG
- d = 3000000
- n = INT(LOG(d) / LOG(100))
- m = n
- DO WHILE d > 0
- a(i) = d \ 100 ^ n
- d = d MOD 100 ^ n
- i = i + 1
- n = n - 1
- LOOP
- d2 = a(0)
- i = 1
- DO WHILE i ^ 2 > d2
- i = i + 1
- LOOP
- d2 = d2 - i
- sqrt = i
- i = 1
- DO
- d2 = 100 * d2 + a(i)
- a = 20 * sqrt
- j = 0
- DO UNTIL (a + j) * j > d2
- j = j + 1
- LOOP
- j = j - 1
- d2 = d2 - (a + j) * j
- sqrt = 10 * sqrt + j
- i = i + 1
- LOOP UNTIL d2 > 20000000
- m1 = INT(LOG(sqrt) / LOG(10))
- PRINT sqrt * 10 ^ (m - m1)
- END
Решение задачи: «По-цифровое извлечение квадратного корня»
textual
Листинг программы
- CLS
- DIM d AS LONG
- DIM d2 AS LONG
- DIM sqrt AS LONG
- DIM a(9) AS LONG
- d = 3000000
- n = INT(LOG(d) / LOG(100))
- m = n
- DO WHILE d > 0
- a(i) = d \ 100 ^ n
- d = d MOD 100 ^ n
- i = i + 1
- n = n - 1
- LOOP
- d2 = a(0)
- i = 1
- DO WHILE i ^ 2 > d2
- i = i + 1
- LOOP
- d2 = d2 - i
- sqrt = i
- i = 1
- DO
- d2 = 100 * d2 + a(i)
- b = 20 * sqrt
- j = 0
- DO UNTIL (b + j) * j > d2
- j = j + 1
- LOOP
- j = j - 1
- d2 = d2 - (b + j) * j
- sqrt = 10 * sqrt + j
- i = i + 1
- LOOP UNTIL d2 > 20000000
- m1 = INT(LOG(sqrt) / LOG(10))
- PRINT sqrt * 10 ^ (m - m1)
- END
Объяснение кода листинга программы
В этом коде задача сводится к вычислению квадратного корня числа d, представленного в двоичной системе счисления, с помощью цикла DO-LOOP.
- Переменные:
- d - исходное число
- n - степень двойки, полученная путем деления логарифма d по основанию 100 на логарифм 100
- m - копия значения n
- a(i) - массив для хранения остатков от деления d на 100 в степени n
- d2 - текущее значение d, записанное в двоичной системе счисления
- i - счетчик для перебора массива a(i)
- b - множитель для вычисления значения d2
- j - счетчик для вычисления квадратного корня d2
- Циклы:
- Внешний цикл DO-LOOP используется для вычисления остатков от деления d на 100 в степени n и записи их в массив a(i). Значение d уменьшается на каждом шаге цикла, пока оно не станет меньше 100 в степени n.
- Внутренний цикл DO-LOOP используется для вычисления квадратного корнера d2. Значение i увеличивается на каждом шаге цикла, пока (b + j) * j не станет больше d2.
- Вычисление квадратного корня:
- Значение d2 уменьшается на (b + j) * j на каждом шаге внутреннего цикла DO-LOOP.
- Значение sqrt увеличивается на 10 * j на каждом шаге внешнего цикла DO-LOOP.
- Вывод результата:
- Значение sqrt умножается на 10 в степени (m - m1) и выводится на экран. Здесь m1 - это целая часть логарифма sqrt по основанию 10.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д