Разработать программу для нахождения наибольшего общего делителя (НОД) двух заданных натуральных чисел с рекурсией.
ЯП - любой (но лучше C или Pascal)
Другие языки программирования и технологии
Помогите пожалуйста по алгоритмам. Написать программу.
Что есть. Без рекурсии на паскале и асме:
function NOD(a, b: integer): integer; //Наибольший общий делитель по Алгоритму Евклида
var
i, n, k: integer;
begin
if a < b then begin
i := a;
a := b;
b := i;
end;
if b = 0 then
Exit;
n := 0;
repeat
n := k;
k := a mod b;
a := b;
b := k;
until b = 0;
Result := Abs(n);
end;
function NOD(const a, b: integer): integer; assembler; //Наибольший общий делитель по Алгоритму Евклида
asm
pushad
mov eax, a
mov ebx, b
cmp eax, ebx
jnl @step
xchg eax, ebx
@step:
push ebx
test ebx, ebx
jz @error
mov ecx, ebx
neg ecx
cmp ecx, ebx
jl @dont_neg_b
mov ebx, ecx
@dont_neg_b:
xor ecx, ecx
@repeat:
mov Result, ecx
xor edx, edx
test ebx, ebx
jz @error
idiv ebx
mov eax, ebx
mov ebx, edx
mov ecx, ebx
test ebx, ebx
jnz @repeat
pop ebx
mov ecx, Result
test ecx, ecx
jnz @exit
mov Result, ebx
jmp @exit
@error:
pop ebx
xor eax, eax
mov Result, eax
jmp @full_exit
@exit:
mov eax, Result
mov ebx, eax
neg ebx
cmp ebx, eax
jl @full_exit
mov Result, ebx
@full_exit:
popad
end;
function NOD(a, b: integer): integer; //Наибольший общий делитель по Алгоритму Евклида
var
i, n, k: integer;
begin
if a < b then begin
i := a;
a := b;
b := i;
end;
if b = 0 then
Exit;
n := 0;
repeat
n := k;
k := a mod b;
a := b;
b := k;
until b = 0;
Result := Abs(n);
end;
function NOD(const a, b: integer): integer; assembler; //Наибольший общий делитель по Алгоритму Евклида
asm
pushad
mov eax, a
mov ebx, b
cmp eax, ebx
jnl @step
xchg eax, ebx
@step:
push ebx
test ebx, ebx
jz @error
mov ecx, ebx
neg ecx
cmp ecx, ebx
jl @dont_neg_b
mov ebx, ecx
@dont_neg_b:
xor ecx, ecx
@repeat:
mov Result, ecx
xor edx, edx
test ebx, ebx
jz @error
idiv ebx
mov eax, ebx
mov ebx, edx
mov ecx, ebx
test ebx, ebx
jnz @repeat
pop ebx
mov ecx, Result
test ecx, ecx
jnz @exit
mov Result, ebx
jmp @exit
@error:
pop ebx
xor eax, eax
mov Result, eax
jmp @full_exit
@exit:
mov eax, Result
mov ebx, eax
neg ebx
cmp ebx, eax
jl @full_exit
mov Result, ebx
@full_exit:
popad
end;
int divide(int a, int b, int divider)
{
if ((a % divider == 0) && (b % divider == 0)) {
return divider;
}
return divide(a, b, --divider);
}
int main()
{
int a = 10;
int b = 15;
int divider = (a > b) ? a : b;
divider = divide(a, b, divider);
printf("Divider: %d\n", divider);
}
{
if ((a % divider == 0) && (b % divider == 0)) {
return divider;
}
return divide(a, b, --divider);
}
int main()
{
int a = 10;
int b = 15;
int divider = (a > b) ? a : b;
divider = divide(a, b, divider);
printf("Divider: %d\n", divider);
}
???? ??????
Над алгоритмом не запаривался. :(
???? ??????
Отредактировал. С рекурсией теперь.
int gcd(int a, int b) {
return b? gcd(b, a % b) : a;
}
return b? gcd(b, a % b) : a;
}
Похожие вопросы
- Помогите пожалуйста в Delphi написать программу
- Помогите, пожалуйста, с алгоритмом для проги.
- Помогите пожалуйста создать алгоритм!
- Помогите по C# плиз, напишите программу по теме "Циклы". Задание ниже
- помоги пожалуйста! ты можешь через программу fotoshop поменять мне цифру в паспорте с 1999 по 1996?
- Помогите, пожалуйста, найти ошибку в программе сортировки стека (по убыванию ) на Си.
- помогите пожалуйста! блокировался Windows,написано для разблокировки отправить sms на номер 3649. в комп вообще невойти
- Помогите написать алгоритм и программу на фортране
- Нужно написать программу (помогите с алгоритмом) с++
- Написать программу в Паскале для построения графика функций. К программе желательно составить алгоритм.