Реализации алгоритмов/Алгоритм Евклида: различия между версиями
Содержимое удалено Содержимое добавлено
→BASIC: Оптимизации |
Усовершенствования алгоритма для разных языков |
||
Строка 27:
==[[w:Бейсик|BASIC]]==
===
Цикл, вычитание (операция нахождения остатка MOD отсутствовала в этой версии языка):
<source lang="basic">
10
20 INPUT A, B
30 PRINT "GCD("; A; ", "; B,") = "; 60 LET B = ABS(B)
100 LET B = B - A: IF B >= A THEN GOTO 100
110 IF B > 0 THEN GOTO 80
120 PRINT A
130 END
</source>
===[[w:GW-BASIC|GW-BASIC]] и совместимые диалекты===
Цикл, деление с остатком
<source lang="basic">
10 INPUT "Two integer numbers", A%, B%
20 PRINT "GCD("; A%; ", "; B%; ") = ";
30
40
50 IF A% = 0 THEN A%
60 WEND
70 PRINT ABS(A%)
</source>
===[[w:QuickBasic|QuickBasic]] версий < 4.0, [[w:Turbo Basic|Turbo Basic]]===
Цикл, деление с остатком
<source lang="basic">
DEF FNGCD%(A%, B%)
A% = A% MOD B%
IF A% = 0 THEN
FNGCD% = ABS(B%)
EXIT DEF
END IF
B% = B% MOD A%
LOOP
FNGCD% = ABS(A%)
END DEF
</source>
Строка 85 ⟶ 76 :
В следующих примерах используется тип <code>Long</code> (длинное целое); вместо него можно применять также тип <code>Integer</code> (стандартное целое).
Цикл, деление с остатком
<source lang="vb">
Function GCD(a As Long, b As Long) As Long
Do Until b = 0
a = a Mod b
If a = 0 Then
GCD = b
Строка 101 ⟶ 86 :
End If
b = b Mod a
Loop
GCD = a
Строка 113 ⟶ 94 :
<source lang="vb">
Function GCD(a As Long, b As Long) As Long
End Function
</source>
===[[w:VB.NET|
В следующих примерах используется тип <code>Long</code> (длинное целое); вместо него можно применять любые другие целочисленные типы платформы [[w:NET_Framework|.NET]].
Цикл, деление с остатком
<source lang="vb">
Do Until b = 0
a = a Mod b
If a = 0 Then Return Math.Abs(b)
b = b Mod a
Loop
Return Math.Abs(a)
End Function
</source>
Рекурсия, деление с остатком
<source lang="vb">
Return If(b = 0, Math.Abs(a), GCD(b, a Mod b)) ' VB.NET 2008 или более поздняя версия
End Function
</source>
==[[w:C (язык программирования)|C]]/[[w:C++|C++]]==
'''C:''' Тип <code>
<source lang="c">typedef int
'''C++:''' Любую из нижеприведённых функций (включая <code>abs</code>) следует предварить строкой:
<source lang="cpp">template <
Для корректной обработки отрицательных чисел все последующие примеры на C/C++ используют функцию вычисления модуля числа:
<source lang="c">
}
</source>
Деление с остатком, цикл:
<source lang="c">
for (Integer c; b; ) {
c = a %
}
return abs(a);
}
</source>
Без использования дополнительной переменной:
<source lang="c">
Integer gcd (Integer a, Integer b) {
while (b)
b ^= a ^= b ^= a %= b;
return abs(a);
}
</source>
Без использования дополнительной переменной и с наименьшим числом сравнений и присваиваний:
<source lang="c">
return abs(b);
if
return abs(a); for ( ; ; )
if (!(a %= b))
return abs(b);
else if (!(b %= a))
return abs(a);
}
</source>
Строка 194 ⟶ 176 :
Деление с остатком, рекурсия:
<source lang="c">
}
</source>
Строка 201 ⟶ 183 :
Вычитание, цикл:
<source lang="c">
if (!a)
return b;
do {
b -= a;
} while (b >= a);
}
return a;
Строка 214 ⟶ 199 :
</source>
==[[w:C_Sharp|C#]], [[w:Java|Java]]==
Приведён код для C#. Для Java следует заменить <code>Abs</code> на <code>abs</code> и, для соответствия правилам оформления кода, переименовать функции в <code>gcd</code> и перенести <code>{</code> в конец предыдущей строки.
Вместо <code>long</code> можно использовать и другие целочисленные типы — <code>byte</code>, <code>int</code> и т. д.
Деление с остатком, цикл:
<source lang="csharp">
static long GCD
{
while (b != 0)
b = a % (a = b);
return Math.Abs(a
}
</source>
<source lang="csharp">
static long GCD(long a, long b)
{
if (a == 0)
return Math.Abs(b);
if (b == 0)
return Math.Abs(a);
for ( ; ; ) {
if ((a %= b) == 0)
return Math.Abs(b);
if ((b %= a) == 0)
return Math.Abs(a);
}
}
</source>
Строка 231 ⟶ 234 :
static long GCD (long a, long b)
{
return b == 0 ? Math.Abs(
}
</source>
Строка 260 ⟶ 263 :
Тип <code>IntType</code> определён как:
<source lang="go">
type
</source>
Для корректной обработки отрицательных чисел все последующие примеры на Go используют функцию вычисления модуля числа:
<source lang="go">
func IntAbs(value
if value < 0 {
return -value
Строка 275 ⟶ 278 :
Деление с остатком, цикл:
<source lang="go">
func GCD(a, b
for b != 0 {
a %= b
Строка 287 ⟶ 290 :
</source>
Деление с остатком, рекурсия:
<source lang="go">
func GCD(a, b
if b == 0 {
}
return GCD(b, a % b)
}
</source>
Строка 318 ⟶ 311 :
==[[w:Паскаль (язык программирования)|Pascal]]==
Тип <code>
<source lang="pascal">
type
</source>
Деление с остатком, цикл:
<source lang="pascal">
function GCD
begin
begin
a :=
end
else
b := b mod a
end;
GCD := Abs(a)
end;
</source>
Строка 353 ⟶ 337 :
Деление с остатком, рекурсия:
<source lang="pascal">
function GCD
begin
end;
</source>
Строка 366 ⟶ 350 :
<source lang="perl">
sub gcd {
}
</source>
Строка 374 ⟶ 358 :
<source lang="php">
function gcd ($a, $b) {
return abs($b);
if ($b === 0)
return abs($a)
for ( ; ; )
if (($a %= $b) === 0)
else if (($b %= $a) === 0)
return abs($a);
}
echo gcd(5, 3);
Строка 409 ⟶ 395 :
Деление с остатком, цикл:
<source lang="python">
def gcd
</source>
Деление с остатком, рекурсия:
<source lang="python">
def gcd
</source>
Строка 424 ⟶ 410 :
Деление с остатком, цикл:
<source lang="ruby">
def gcd
end
</source>
Строка 432 ⟶ 418 :
Деление с остатком, рекурсия:
<source lang="ruby">
def gcd
end
</source>
Строка 463 ⟶ 435 :
pub fn gcd <IntType> (mut a: IntType, mut b: IntType) -> IntType
where IntType: Copy + FromPrimitive + PartialEq + Rem<Output = IntType> {
}
a
}
</source>
Строка 480 ⟶ 452 :
pub fn gcd <T: Copy + PartialOrd + SubAssign> (mut a: T, mut b: T) -> T {
}
}
a
}
</source>
Строка 502 ⟶ 474 :
<source lang="bash">
gcd () {
}
Строка 522 ⟶ 494 :
ЗАДАЧА НОД (a, b: ЦЕЛ): ЦЕЛ;
УКАЗ
a := a ОСТАТОК b;
ЕСЛИ a = 0 ТО
b := 0
ИНАЧЕ
b := b ОСТАТОК a
КОН
КОН;
ВОЗВРАТ МОДУЛЬ(a
КОН НОД;
</source>
|