Viết chương trình tách số nguyên dương A (A < 200) thành tổng của hai số nguyên dương x và y sao cho ước chung lớn nhất d của x và y là lớn nhất trong các cách phân tích có được

2 câu trả lời

uses crt;
var i,a,x,y:longint;
function ucln(a,b:longint):longint;
begin 
   while a<>b do 
      if a<b then b:=b-a else a:=a-b;
   ucln:=a;
end;
begin
clrscr;
   repeat 
      write('A= ');readln(a);
   until a<200;
   x:=1; y:=1;
   for i:=1 to a-1 do 
      if ucln(i,a-i)>ucln(x,y) then begin x:=i; y:=a-i; end;
   writeln(x,' ',y);
readln
end.

*Dùng chương trình con (hàm UCLN)

program tong_UCLN;
uses crt;
var A,n,m,max,i:integer;

function UCLN(x,y:integer):integer;
begin
    while x<>y do
        if x>y then x:=x-y else y:=y-x;
    UCLN:=x;
end;

BEGIN
    clrscr;
    write('Nhap A: ');  readln(a);
    n:=1; m:=a-1;    max:=1;
    for i:=2 to a div 2 do
        if UCLN(i,a-i)>=max then
            begin
                max:=UCLN(i,a-i);
                n:=i; m:=a-i;
            end;
    writeln(n,' ',m);
    write('UCLN la: ',max);
    readln;
end.

*Không dùng chương trình con.

program tong_UCLN;
uses crt;
var A,n,m,max,x,y,i:integer;
BEGIN
    clrscr;
    write('Nhap A: ');  readln(a);
    n:=1; m:=a-1;    max:=1;
    for i:=2 to a div 2 do
        begin
            x:=i; y:=a-i;
            while x<>y do
                if x>y then x:=x-y else y:=y-x;
            if x>max then
                begin
                    max:=x;
                    n:=i; m:=a-i;
                end;
        end;
    writeln(n,' ',m);
    write('UCLN la: ',max);
    readln;
end.