Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Program Project2;
- {Имеется три группы монахов: ведущие-M1, простые-M2, ученики-M3.
- M-монахов едят N пирогов: N1 пирогов съедает один ведущий монах,
- N2 пирогов съедает один простой монах, N3 - один монах-ученик.
- Задача:
- Найти все возможные комбинации чисел монахов каждой группы, чтоб
- соблюдалось равенство M1+M2+M3=M и M1*N1+M2*N2+M3*N3=N}
- Var
- M, i, j, M3, M1, M2, N_over_N1, scorer: integer;
- N1, N2, N3, N: extended;
- Dif_N2_N1, Dif_N3_N1, Dif_N3_N2: real;
- {$APPTYPE CONSOLE}
- Begin
- // текстовое пояснение с ограничениями для ввода данных
- writeln('NOTE', ':');
- writeln('The number of monks must be integer and bigger than zero.');
- writeln('The nuber of cakes must be bigger than zero.');
- writeln('The number of cakes, which goes to one Monk must be bigger than zero.');
- writeln('--------------------------------------------------------------------------------------');
- writeln('NOW enter the values!');
- writeln;
- writeln('Enter the value of Monks');
- readln(M);
- writeln;
- writeln('Enter the total number of cakes:');
- readln(N);
- writeln;
- writeln('Enter the number of cakes, which goes to one Monk from the first group:');
- readln(N1);
- writeln;
- writeln('Enter the number of cakes, which goes to one Monk from the second group:');
- readln(N2);
- writeln;
- writeln('Enter the number of cakes, which goes to one Monk from the third group:');
- readln(N3);
- writeln;
- writeln('--------------------------------------------------------------------------------------');
- // Сокращенное написание разницы двух переменных
- Dif_N2_N1 := N2 - N1;
- Dif_N3_N1 := N3 - N1;
- Dif_N3_N2 := N3 - N2;
- // переменная для случая N1=N2=N3
- N_over_N1 := trunc(N / N1);
- // счетчик решений
- scorer := 0;
- // проверка введенных данных
- if (M <= 0) or (N1 <= 0) or (N2 <= 0) or (N3 <= 0) or (N <= 0) then
- // сообщение о вводе некорректных данных
- begin
- writeln('Incorrect type of variable: "M" must be integer and not negative; "N,N1,N2,N3" must be bigger that zero.');
- writeln('Check up correctness of all input data and try again.');
- end
- else
- // шапка с информацией об исходных данных в случае, если они верны
- begin
- writeln('Input data:');
- writeln;
- writeln('The total number of Monks', ':', M);
- writeln('The total number of cakes', ':', N);
- writeln('The number of cakes, which goes to one Monk from the first group', ':', N1);
- writeln('The number of cakes, which goes to one Monk from the second group', ':', N2);
- writeln('The number of cakes, which goes to one Monk from the third group', ':', N3);
- writeln;
- writeln('--------------------------------------------------------------------------------------');
- writeln('SOLVING:');
- writeln;
- end;
- // начало решение задачи, проверка N1,N2,N3>0
- if (N1 > 0) and (N2 > 0) and (N3 > 0) then
- for i := 0 to M do
- // случай, когда N1=N2
- if (Dif_N2_N1 = 0) and (N1 <> N3) then
- begin
- M3 := trunc((N - N1 * M) / Dif_N3_N1);
- M1 := M - M3 - i;
- if (M3 >= 0) and (M1 >= 0) then
- begin
- // вывод решений, увеличение счетчика цикла на 1
- scorer := scorer + 1;
- writeln('M[1]=', M1, ' ', 'M[2]=', i, ' ', 'M[3]=', M3);
- writeln('--------------------------------------------------------------------------------------');
- end;
- end
- else
- // случай, когда N1=N3
- if (Dif_N3_N1 = 0) and (N1 <> N2) then
- begin
- M2 := trunc((N - N1 * M) / Dif_N2_N1);
- M3 := M - i - M2;
- M1 := i;
- if (M2 >= 0) and (M3 >= 0) then
- begin
- // вывод решений, увеличение счетчика цикла на 1
- scorer := scorer + 1;
- writeln('m[1]=', M1, ' ', 'm[2]=', M2, ' ', 'm[3]=', M3);
- writeln('--------------------------------------------------------------------------------------');
- end;
- end
- else
- // случай, когда N2=N3
- if (Dif_N3_N2 = 0) and (N2 <> N1) then
- begin
- M1 := trunc((N3 * M - N) / Dif_N3_N1);
- M3 := M - M1 - i;
- if (M1 >= 0) and (M3 >= 0) then
- begin
- // вывод решений, увеличение счетчика цикла на 1
- scorer := scorer + 1;
- writeln('m[1]=', M1, ' ', 'm[2]=', i, ' ', 'm[3]=', M3);
- writeln('--------------------------------------------------------------------------------------');
- end;
- end
- else
- // случай, когда N1=N2=N3
- if (N1 = N2) and (N3 = N2) then
- // подбор всех возможных комбинаций перестановками
- for j := 0 to trunc(N / N1) do
- begin
- M3 := N_over_N1 - i - j;
- if (j + i + M3 = N / N1) and (M3 >= 0) then
- begin
- // вывод решений, увеличение счетчика цикла на 1
- scorer := scorer + 1;
- writeln('m[1]=', j, ' ', 'm[2]=', i, ' ', 'm[3]=', M3);
- writeln('--------------------------------------------------------------------------------------');
- end;
- end
- else
- // случай, когда N1, N2, N3 - разные
- begin
- M3 := trunc((N - N1 * M - Dif_N2_N1 * i) / Dif_N3_N1);
- M1 := M - I - M3;
- M2 := i;
- if (M1 >= 0) and (M3 >= 0) and ((m3 * n3 + m2 * n2 + n1 * m1) = n) then
- begin
- // вывод решений, увеличение счетчика цикла на 1
- scorer := scorer + 1;
- writeln('m[1]=', M1, ' ', 'm[2]=', M2, ' ', 'm[3]=', M3);
- writeln('--------------------------------------------------------------------------------------');
- end;
- end;
- writeln;
- // вывод количества решений
- writeln('Number of solutions:', scorer);
- readln;
- End.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement