Реализации алгоритмов/Алгоритм Евклида: различия между версиями

Содержимое удалено Содержимое добавлено
→‎Б3-21, МК-46 / 64, МС-1103: Поправка для обработки 0
Новые реализации на разных диалектах BASIC
Строка 27:
 
==[[w:Бейсик|BASIC]]==
===[[w:Dartmouth_BASIC|Оригинальный BASIC]]===
Деление с остатком, цикл:
Цикл, вычитание (операция нахождения остатка MOD отсутствовала в этой версии языка):
<source lang="basic">
10 INPUT "Two integer numbers", A, B
20 PRINT "GCD("; A; ", "; B,") = ";
30 LET A = ABS(A): LET B = ABS(B)
40 IF B = 0 THEN GOTO 90
50 IF A >= B THEN LET A = A - B: GOTO 50
60 IF A = 0 THEN LET A = B: GOTO 90
70 IF B >= A: LET B = B - A: GOTO 70
80 GOTO 40
90 PRINT A
100 END
</source>
 
===[[w:GW-BASIC|GW-BASIC]] и совместимые диалекты===
Цикл, деление с остатком либо вычитание (при указанных заменах в коде).
<source lang="basic">
10 INPUT "Two integer numbers";, A%, B%
20 PRINT "GCD("; A%; ", "; B%; ") = ";
30 WHILEA% = ABS(A%): B% <>= 0ABS(B%)
40 A%WHILE = AB% MOD> B%0
50 A% = A% MOD B% 'Для вычитания заменить на WHILE A% >= B%: A% = A% - B%: WEND
50 SWAP A%, B%
60 IF A% = 0 THEN A% = B%: GOTO 90
60 WEND
70 B% = B% MOD A% 'Для вычитания заменить на WHILE B% >= A%: B% = B% - A%: WEND
70 PRINT ABS(A%)
80 WEND
90 PRINT A%
</source>
 
===[[w:QuickBasic|QuickBasic]] версий < 4.0, [[w:Turbo Basic|Turbo Basic]]===
Цикл, деление с остатком либо вычитание (при указанных заменах в коде).
<source lang="basic">
DEF FNGCD% (A%, B%)
A% = ABS(A%)
DO WHILE B% <> 0
A B% = A% MOD ABS(B%)
DO WHILE B% > 0
SWAP A%, B%
A% = A% MOD LOOPB%
'Для вычитания заменить предыдущую строку следующими:
FNGCD% = ABS(A%)
'DO WHILE A% >= B%
' A% = A% - B%
'LOOP
IF A% = 0 THEN
FNGCD% = B%
EXIT DEF
END IF
B% = B% MOD A%
'Для вычитания заменить предыдущую строку следующими:
'DO WHILE B% >= A%
' B% = B% - A%
'LOOP
LOOP
FNGCD% = A%
END DEF
</source>
 
===[[w:PowerBASIC|PowerBASIC]], [[w:QBASIC|QBASIC]], [[w:QuickBasic|QuickBasic]] версий ≥ 4.0, [[w:Visual Basic|Visual Basic]]===
В следующих примерах используется тип <code>Integer</code> (стандартное целое); вместо него можно применять также тип <code>Long</code> (длинное целое).
 
Цикл, деление с остатком либо вычитание (при указанных заменах в коде):
<source lang="vb">
Function GCD (a As Integer, b As Integer) As Integer
a = Abs(a)
Do While a <> 0 And b <> 0
b = Abs(b)
If a > b Then
a Do =While ab Mod> b0
a = a Mod b
Else
'Для вычитания заменить предыдущую строку следующими:
b = b Mod a
'Do While a >= b
' a = a - b
'Loop
If a = 0 Then
GCD = b
Exit Function
End If
b = b Mod a
'Для вычитания заменить предыдущую строку следующими:
'Do While b >= a
' b = b - a
'Loop
Loop
GCD = a
GCD = Abs(a + b) ' Для VB.NET следует заменить эту строку на Return Math.Abs(a + b)
End Function
</source>
 
ДелениеРекурсия, деление с остатком, рекурсия:
===[[w:PowerBASIC|PowerBASIC]], [[w:QBASIC|QBASIC]], [[w:QuickBasic|QuickBasic]] версий ≥ 4.0, [[w:Visual Basic|Visual Basic]]===
<source lang="vb">
Function GCD (a As Integer, b As Integer) As Integer
If b = 0 Then
GCD = Abs(a)
GCD = Abs(a) ' Для VB.NET следует заменить эту строку на Return Math.Abs(a)
Else
GCD = GCD(b, a Mod b) ' Для VB.NET следует заменить GCD = на Return
End If
End Function
</source>
 
===[[w:VB.NET|VB.NET]]===
В следующих примерах используется тип <code>Integer</code> (стандартное целое); вместо него можно применять любые другие целочисленные типы платформы [[w:NET_Framework|.NET]].
 
Цикл, деление с остатком либо вычитание (при указанных заменах в коде):
<source lang="vb">
Shared Function GCD(ByVal a As Integer, ByVal b As Integer) As Integer
a = Math.Abs(a)
b = Math.Abs(b)
Do While b > 0
a = a Mod b
'Для вычитания заменить предыдущую строку следующими:
'Do While a >= b
' a -= b
'Loop
If a = 0 Then Return b
b = b Mod a
'Для вычитания заменить предыдущую строку следующими:
'Do While b >= a
' b -= a
'Loop
Loop
Return a
End Function
</source>
 
Рекурсия, деление с остатком:
<source lang="vb">
Function GCD (a As Integer, b As Integer) As Integer
If b = 0 Then Return Math.Abs(a)
Return GCD(b, a Mod b)
End Function
</source>