Мин,макс,нод,нок на делфи

Здравствуйте. Задали написать прогу, на входе два числа. Форма,а в форме четыре кнопки (min,max,nod,nok) и и три окна: два для ввода чисел, одно для результата. На выходе: прога должна распознать минимальное из чисел, максимальное, наименьший общий делить и наименьшее общее кратное. С мином и максом я справился. С НОДом и НОКом ситуация сложная. Не работает, не компилируется. Может кто-то уже писал подобное? Не поделитесь исходниками? нод нок
8 ответов

Это можно сделать "в лоб"! Для наименьшего общего делителя: Перебираем в цикле все натуральные числа начиная с 2 до найденного значения максимального включительно и проверяем делятся ли наши два числа на эти числа, пока не найдём число, которое делится и на то и на другое. Оно и будет общим делителем. Если такого числа не найдётся, то общих делителей кроме 1 нет. Для наименьшего общего кратного: Перебираем все натуральные числа, опять же в цикле, начиная с максимального и до тех пор пока не найдём такое, которое делится на оба исходных числа. Это будет наименьший общий делитель.


у меня нет необходимости вводить цикл, у меня всего два числа (вводимых пользователем). Короче, вот код, но вывод не работает правильно. Подскажите как сделать вывод всего того, чтоу меня получилось, а? п.с. с делфи я первый день знаком
unit Unit1;
interface
uses
 SysUtils, Windows, Messages, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Math, ExtCtrls;
type
 TForm1 = class(TForm)
 Num1: TEdit;
 Num2: TEdit;
 min: TButton;
 max: TButton;
 NOD: TButton;
 NOK: TButton;
 Label1: TLabel;
 procedure NODClick(Sender: TObject);
 procedure NOKClick(Sender: TObject);
 procedure minClick(Sender: TObject);
 procedure maxClick(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;

var
 Form1: TForm1;
 a,b,NOD,NOK,Num1,Num2 : Integer;
 Label1 : Integer;
 R1 : Integer;
 R2 : Integer;

implementation
{$R *.dfm}

procedure TForm1.NODClick(Sender: TObject);
var
 NOD, Num1, Num2, D, I : Integer;
begin
if Num1*Num2 = 0 then NOD:= Num1+Num2
 else
 begin
 D:= 1;
 I:= 1;
 repeat
 I:= I+1;
 if (Num1 mod I = 0) and (Num2 mod I = 0) then
 begin
 Num1:= Trunc(Num1/I);
 Num2:= Trunc(Num2/I);
 D:= D*I;
 I:= 1;
 end;
 until (Num1 <= I) or (Num2 <= I);
 NOD:= D;
 end;
end;

procedure TForm1.NOKClick(Sender: TObject);
var
 NOK, Num1, Num2, I, K : Integer;
begin
 if Num1*Num2 = 0 then NOK:= Num1+Num2
 else
 begin
 K:= Num1*Num2;
 I:= 1;
 repeat
 I:= I+1;
 if (Num1 mod I = 0) and (Num2 mod I = 0) then
 begin
 Num1:= Trunc(Num1/I);
 Num2:= Trunc(Num2/I);
 K:= Trunc(K/I);
 I:= 1;
 end;
 until (Num1 <= I) or (Num2 <= I);
 NOK:= K;
 end;
end;

procedure TForm1.minClick(Sender: TObject);
var
 Num1, Num2, a, b : Integer;
begin
 if Num1>Num2 then
 Label1.Caption:=IntToStr(Num2)
 else
 Label1.Caption:=IntToStr(Num1);
end;

procedure TForm1.maxClick(Sender: TObject);
var
 Num1, Num2, a, b : Integer;
begin
 if Num1>Num2 then
 Label1.Caption:=IntToStr(Num1)
 else
 Label1.Caption:=IntToStr(Num2);
end;

end.


Зачем так сложно? Вот классическое решение на паскале:
var a, b, HOD, HOK, m:integer;
begin
writeln('ввод 2 чисел');
readln(a,b);
m:=a*b;
while a<>b do
if a>b then a:=a-b
else b:=b-a;
HOD:=a;
HOK:=round(m/HOD);
writeln('HOD= ', HOD);
writeln('HOK= ', HOK);
end.


спасибо, но требуют написать на Делфи с использованием формы. Даже не VB Нельзя)


Проект, как и обещал. Только вот как вложение прикрепить не получилось. Прямая ссылка: http://getfile.biz/62079


Только вот как вложение прикрепить не получилось
У меня тоже такое было. Оказывается все, что когда-то мной выкладывалось, за мной и числится, а существует ограничение, что-то чуть больше мега. Затер старые вложения и все ок. Пардон, что не в тему. Можно удалить (съесть) после прочтения.


AVer cпасибо огромное!


Помогите пожалуйста решить эту задачу с помощью рекурсии. Вот что у меня получилось без рекурсии:Procedure Nodk(m0,n0:word; var D,K:word); Var m,n:word; begin m:=m0; n:=n0; d:= n mod m; While d <> 0 do Begin n:=m; m:=d; d:=n mod m; end; D:=m; K:=(n0 div d)*m0 ; End;