По-цифровое извлечение квадратного корня - 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

Код к задаче: «По-цифровое извлечение квадратного корня - QBasic»

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

15   голосов, оценка 3.600 из 5


СОХРАНИТЬ ССЫЛКУ