Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.51 KB | None | 0 0
  1. Program Project2;
  2.  
  3. {Имеется три группы монахов: ведущие-M1, простые-M2, ученики-M3.
  4. M-монахов едят N пирогов: N1 пирогов съедает один ведущий монах,
  5. N2 пирогов съедает один простой монах, N3 - один монах-ученик.
  6. Задача:
  7. Найти все возможные комбинации чисел монахов каждой группы, чтоб
  8. соблюдалось равенство M1+M2+M3=M и M1*N1+M2*N2+M3*N3=N}
  9.  
  10. Var
  11.   M, i, j, M3, M1, M2, N_over_N1, scorer: integer;
  12.     N1, N2, N3, N: extended;
  13.   Dif_N2_N1, Dif_N3_N1, Dif_N3_N2: real;
  14. {$APPTYPE CONSOLE}
  15. Begin
  16.  
  17.     // текстовое пояснение с ограничениями для ввода данных
  18.   writeln('NOTE', ':');
  19.   writeln('The number of monks must be integer and bigger than zero.');
  20.   writeln('The nuber of cakes must be bigger than zero.');
  21.   writeln('The number of cakes, which goes to one Monk must be bigger than zero.');
  22.   writeln('--------------------------------------------------------------------------------------');
  23.   writeln('NOW enter the values!');
  24.   writeln;
  25.   writeln('Enter the value of Monks');
  26.   readln(M);
  27.   writeln;
  28.     writeln('Enter the total number of cakes:');
  29.   readln(N);
  30.   writeln;
  31.   writeln('Enter the number of cakes, which goes to one Monk from the first group:');
  32.   readln(N1);
  33.   writeln;
  34.   writeln('Enter the number of cakes, which goes to one Monk from the second group:');
  35.   readln(N2);
  36.   writeln;
  37.   writeln('Enter the number of cakes, which goes to one Monk from the third group:');
  38.   readln(N3);
  39.   writeln;
  40.   writeln('--------------------------------------------------------------------------------------');
  41.  
  42.   // Сокращенное написание разницы двух переменных
  43.   Dif_N2_N1 := N2 - N1;
  44.   Dif_N3_N1 := N3 - N1;
  45.   Dif_N3_N2 := N3 - N2;
  46.  
  47.   // переменная для случая N1=N2=N3
  48.   N_over_N1 := trunc(N / N1);
  49.  
  50.   // счетчик решений
  51.  
  52.   scorer := 0;
  53.  
  54.   // проверка введенных данных
  55.   if (M <= 0) or (N1 <= 0) or (N2 <= 0) or (N3 <= 0) or (N <= 0) then
  56.  
  57.     // сообщение о вводе некорректных данных
  58.   begin
  59.     writeln('Incorrect type of variable: "M" must be integer and not negative; "N,N1,N2,N3" must be bigger that zero.');
  60.     writeln('Check up correctness of all input data and try again.');
  61.   end
  62.  
  63.   else
  64.  
  65.     // шапка с информацией об исходных данных в случае, если они верны
  66.   begin
  67.     writeln('Input data:');
  68.     writeln;
  69.     writeln('The total number of Monks', ':', M);
  70.     writeln('The total number of cakes', ':', N);
  71.     writeln('The number of cakes, which goes to one Monk from the first group', ':', N1);
  72.     writeln('The number of cakes, which goes to one Monk from the second group', ':', N2);
  73.     writeln('The number of cakes, which goes to one Monk from the third group', ':', N3);
  74.     writeln;
  75.     writeln('--------------------------------------------------------------------------------------');
  76.     writeln('SOLVING:');
  77.     writeln;
  78.   end;
  79.  
  80.   // начало решение задачи, проверка N1,N2,N3>0
  81.   if (N1 > 0) and (N2 > 0) and (N3 > 0) then
  82.     for i := 0 to M do
  83.  
  84.       // случай, когда N1=N2
  85.       if (Dif_N2_N1 = 0) and (N1 <> N3) then
  86.       begin
  87.         M3 := trunc((N - N1 * M) / Dif_N3_N1);
  88.         M1 := M - M3 - i;
  89.         if (M3 >= 0) and (M1 >= 0) then
  90.         begin
  91.  
  92.           // вывод решений, увеличение счетчика цикла на 1
  93.           scorer := scorer + 1;
  94.           writeln('M[1]=', M1, ' ', 'M[2]=', i, ' ', 'M[3]=', M3);
  95.           writeln('--------------------------------------------------------------------------------------');
  96.         end;
  97.  
  98.       end
  99.  
  100.       else
  101.  
  102.       // случай, когда N1=N3
  103.       if (Dif_N3_N1 = 0) and (N1 <> N2) then
  104.       begin
  105.         M2 := trunc((N - N1 * M) / Dif_N2_N1);
  106.         M3 := M - i - M2;
  107.         M1 := i;
  108.         if (M2 >= 0) and (M3 >= 0) then
  109.         begin
  110.  
  111.           // вывод решений, увеличение счетчика цикла на 1
  112.           scorer := scorer + 1;
  113.           writeln('m[1]=', M1, ' ', 'm[2]=', M2, ' ', 'm[3]=', M3);
  114.           writeln('--------------------------------------------------------------------------------------');
  115.         end;
  116.  
  117.       end
  118.  
  119.       else
  120.  
  121.       // случай, когда N2=N3
  122.       if (Dif_N3_N2 = 0) and (N2 <> N1) then
  123.       begin
  124.         M1 := trunc((N3 * M - N) / Dif_N3_N1);
  125.         M3 := M - M1 - i;
  126.         if (M1 >= 0) and (M3 >= 0) then
  127.  
  128.         begin
  129.  
  130.           // вывод решений, увеличение счетчика цикла на 1
  131.           scorer := scorer + 1;
  132.           writeln('m[1]=', M1, ' ', 'm[2]=', i, ' ', 'm[3]=', M3);
  133.           writeln('--------------------------------------------------------------------------------------');
  134.         end;
  135.  
  136.       end
  137.  
  138.       else
  139.  
  140.       // случай, когда N1=N2=N3
  141.       if (N1 = N2) and (N3 = N2) then
  142.  
  143.         // подбор всех возможных комбинаций перестановками
  144.         for j := 0 to trunc(N / N1) do
  145.         begin
  146.           M3 := N_over_N1 - i - j;
  147.           if (j + i + M3 = N / N1) and (M3 >= 0) then
  148.  
  149.           begin
  150.  
  151.             // вывод решений, увеличение счетчика цикла на 1
  152.             scorer := scorer + 1;
  153.             writeln('m[1]=', j, ' ', 'm[2]=', i, ' ', 'm[3]=', M3);
  154.             writeln('--------------------------------------------------------------------------------------');
  155.           end;
  156.  
  157.         end
  158.  
  159.       else
  160.  
  161.         // случай, когда N1, N2, N3 - разные
  162.       begin
  163.         M3 := trunc((N - N1 * M - Dif_N2_N1 * i) / Dif_N3_N1);
  164.         M1 := M - I - M3;
  165.         M2 := i;
  166.         if (M1 >= 0) and (M3 >= 0) and ((m3 * n3 + m2 * n2 + n1 * m1) = n) then
  167.  
  168.         begin
  169.  
  170.           // вывод решений, увеличение счетчика цикла на 1
  171.           scorer := scorer + 1;
  172.           writeln('m[1]=', M1, ' ', 'm[2]=', M2, ' ', 'm[3]=', M3);
  173.           writeln('--------------------------------------------------------------------------------------');
  174.         end;
  175.  
  176.       end;
  177.  
  178.   writeln;
  179.  
  180.   // вывод количества решений
  181.   writeln('Number of solutions:', scorer);
  182.   readln;
  183.  
  184. End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement