1

Тема: Рекурсія. Алгоритм Евкліда

Знайти НСД(найбільший спільний дільник) двох натуральних чисел a і b за алгоритмом Евкліда.
Остачу від ділення треба знайти через віднімання.
Ось я написав цей блок програми (пошук остачі через віднімання):

type natur=1..maxint;
procedure NSD(n,m:natur;var r:natur);
begin
if n=m then r:=n
else if n>m then NSD(n-m,m,r)
else NSD(m-n,n,r);
end;

Ось написав програму, де остача від ділення знаходиться через mod.

var a, b, answer: longint;
function gcd(m, n: longint): longint;
    var modulo: longint;
    begin
        modulo := m mod n;
        if modulo = 0 then
            gcd := n
        else
            gcd := gcd (n, modulo)
    end;
 
begin
    writeln('Введіть  2 натуральних числа');
    readln(a, b);
    answer := gcd(a, b);
    writeln(answer);
    readln
end.

Треба замінити пошук через mod (в коді 2) пошуком через віднімання (кодом 1)

«Є два типи мов програмування: ті, на які люди весь час сваряться, і ті, які ніхто не використовує.» Bjarne Stroustrup.

2

Re: Рекурсія. Алгоритм Евкліда

1. Я не зрозумів, що вам треба. У вас є два коди, які роблять практично одне й те саме різними шляхами. Вам  не подобається другий, бо він працює не за тим алгоритмом - це я зрозумів. А чим вам не подобається перший?
2.

NSD(abs(m-n),min(m,n),r)

- так, як на мене, красивіше.

3

Re: Рекурсія. Алгоритм Евкліда

В тому й річ. Що мені треба частину другого коду(де відбувається знаходження остачі) замінити першим кодом. Можете написати кінцевий варіант?

«Є два типи мов програмування: ті, на які люди весь час сваряться, і ті, які ніхто не використовує.» Bjarne Stroustrup.

4 Востаннє редагувалося koala (06.03.2014 11:10:09)

Re: Рекурсія. Алгоритм Евкліда

Я все одно не розумію. Треба - міняйте. Проблема в чому? Якщо обидва коди, як ви пишете, ваші, то проблем не має бути.

5

Re: Рекурсія. Алгоритм Евкліда

Викладач сказала, перший код не змінювати а в другому коді замінити частину, де відбувається пошук остачі через mod першим кодом.

«Є два типи мов програмування: ті, на які люди весь час сваряться, і ті, які ніхто не використовує.» Bjarne Stroustrup.

6

Re: Рекурсія. Алгоритм Евкліда

я не знаю, де його замінити.

«Є два типи мов програмування: ті, на які люди весь час сваряться, і ті, які ніхто не використовує.» Bjarne Stroustrup.

7

Re: Рекурсія. Алгоритм Евкліда

koala написав:

Я все одно не розумію. Треба - міняйте. Проблема в чому? Якщо обидва коди, як ви пишете, ваші, то проблем не має бути.

Допоможете? Які рядки в другому коді треба замінити першим кодом?

«Є два типи мов програмування: ті, на які люди весь час сваряться, і ті, які ніхто не використовує.» Bjarne Stroustrup.

8

Re: Рекурсія. Алгоритм Евкліда

Пане, зізнайтеся самі собі, що це не ваш код, вам цей Паскаль зовсім не потрібен, тільки б здати, і заплатіть вже гроші викладачу... або міняйте спеціальність, бо це - не ваше.

Подякували: 0xDADA11C7, Chemist-i, DOP3

9

Re: Рекурсія. Алгоритм Евкліда

А навіщо ви тут? Щоб допомагати чи ось таку дурню писати? Яка вам різниця, чий це код?

koala написав:

Пане, зізнайтеся самі собі, що це не ваш код, вам цей Паскаль зовсім не потрібен, тільки б здати, і заплатіть вже гроші викладачу... або міняйте спеціальність, бо це - не ваше.

«Є два типи мов програмування: ті, на які люди весь час сваряться, і ті, які ніхто не використовує.» Bjarne Stroustrup.

10

Re: Рекурсія. Алгоритм Евкліда

koala написав:

Пане, зізнайтеся самі собі, що це не ваш код, вам цей Паскаль зовсім не потрібен, тільки б здати, і заплатіть вже гроші викладачу... або міняйте спеціальність, бо це - не ваше.

Я просто хотів перевірити, як ви допомагаєте. І ви ніяк не допомагаєте. Це код мій. І він готовий ось:

type natur=1..maxint;
procedure NSD(n,m:natur;var r:natur);
begin
if n=m then r:=n
else if n>m then NSD(n-m,m,r)
else NSD(m-n,n,r);
end;
var a,b,answer:natur;
begin
writeln('Введіть 2 натуральних числа');
readln(a,b);
NSD(a,b,answer);
writeln('НСД=',answer);
readln
end.
«Є два типи мов програмування: ті, на які люди весь час сваряться, і ті, які ніхто не використовує.» Bjarne Stroustrup.

11 Востаннє редагувалося koala (06.03.2014 16:32:44)

Re: Рекурсія. Алгоритм Евкліда

Мені є різниця. Бо люди на цьому форумі належать до двух великих груп: одні хочуть щось зробити, в них не виходить і вони приходять сюди питати, а інші навіть не намагаються і думають, що їм тут зобов'язані допомогти. Допомога першим дає плюсики в карму, а другим допомогти неможливо, вони, отримавши допомогу, вважають, що можуть робити все менше і менше і все більше звалювати на інших, і жодної користі ані їм, ані суспільству така допомога не дає.
Втім, якщо ви самі впоралися - радий за вас. Модератори, я пропоную зробити попередження vanekulykov, але не банити, він не безнадійний.
Так, і

function NSD(n,m:integer):integer;{замініть на LongWord, якщо вже так кортить додатні використовувати}
begin
  if n = m then result := n
  else          result := NSD( abs( n - m ), min( n, m ) )
end;

var a,b:integer;
begin
  writeln( 'Введіть 2 натуральні числа' );
  readln( a, b );
  writeln( 'НСД=', NSD( a, b ) );
  readln
end.
Подякували: vanekulykov1

12

Re: Рекурсія. Алгоритм Евкліда

Chemist-i написав:

Я пропоную забанити vanekulykov

особисто я роблю попередження
пане vanekulykov, поважайте учасників форуму. якщо така поведінка триватиме й надалі, отримаєте справжній бан

Психологічні бесіди з додатковою послугою промивання мізків. Недорого.
Не дизайню. Взагалі ні разу. У назві розділу "Дизайн та графіка" є слово "графіка" - ось тут трохи шарю. І не більше. Так, часто питають.
Продам гараж

13

Re: Рекурсія. Алгоритм Евкліда

Усім
Топік вичистив.
Раджу стримувати язика наступного разу. Бо сваритися, по-перше, безглуздо, в інтернеті ви усе одно нікому нічого не доведете. По-друге, у мене виникає сильне бажання забанити і лівих і правих, коли я бачу таке.


koala написав:

Пане, зізнайтеся самі собі, що це не ваш код, вам цей Паскаль зовсім не потрібен, тільки б здати, і заплатіть вже гроші викладачу... або міняйте спеціальність, бо це - не ваше.

Якщо вважаєте, що цей топік треба перенести в розділ Пропоную роботу, то так і треба писати.