var
A,B,N: integer;
c,d: real;
begin
write('a=');
readln(a);
write('b=');
readln(b);
write('n=');
readln(n);
if n>a then
begin
c:=n-a;
for b:=a to n do
d:=b/2;
write('d=',d:2:2);
readln;
end;
end.
Неформализованная задача Pascal
Заданы три натуральных числа A, B и N. Найти все натуральные числа, не превосходящие N, которые можно представить в виде суммы (произвольного числа) слагаемых, каждое из которых- А или В.
вычитать из числа одно слагаемое и смотреть делится ли разность на второе без остатка и так до тех пор пока разность не станет меньше 0 или меньше 2 слагаемого
Код:
var
A,B,N: integer;
c,d: real;
begin
write('a=');
readln(a);
write('b=');
readln(b);
write('n=');
readln(n);
if n>a then
begin
c:=n-a;
for b:=a to n do
d:=b/2;
write('d=',d:2:2);
readln;
end;
end.
A,B,N: integer;
c,d: real;
begin
write('a=');
readln(a);
write('b=');
readln(b);
write('n=');
readln(n);
if n>a then
begin
c:=n-a;
for b:=a to n do
d:=b/2;
write('d=',d:2:2);
readln;
end;
end.
паскаль лень было вспоминать, набросал на СИ. думаю идея будет понятна.
Конечно этот код далеко не оптимален и не красивый...
Код:
#include <conio.h>
#include <stdio.h>
int trySub(int i,int a,int b) {
int res;
res=0;
if(i==0)
return 1;
if(a<=i)
res=trySub(i-a,a,b);
if((b<=i)&&(res==0))
res=trySub(i-b,a,b);
return res;
}
int main() {
int a=5,b=7,n=50,i;
clrscr();
for(i=1;i<n;i++)
if(trySub(i,a,b))
printf("%d\n",i);
return 0;
}
#include <stdio.h>
int trySub(int i,int a,int b) {
int res;
res=0;
if(i==0)
return 1;
if(a<=i)
res=trySub(i-a,a,b);
if((b<=i)&&(res==0))
res=trySub(i-b,a,b);
return res;
}
int main() {
int a=5,b=7,n=50,i;
clrscr();
for(i=1;i<n;i++)
if(trySub(i,a,b))
printf("%d\n",i);
return 0;
}
[COLOR="Red"]При чем тут С ? Речь идет о Pascal.Отвечаем только по существу.[/COLOR]модератор.
Я вопще Си не знаю. можно хоть описать как выполняется подпрограмма
1. Если i=0,то заканчиваем выполнение и возвращаем true
2. Если i<a, вызывем саму себя trySub(i-a,a,b).
3 Если i<b и на шаге 2, функция вернула false вызываем trySub(i-b,a,b)
4. Возвращаем резултат, если на шагах 2 и 3 вернулса false его возвращаем, если же где-то true, то возвращаем true.
в основной программе перебераем все натуральные числа, и заганяем в выше описаную функцию.
и так мы рекурсивно попытаемся разложить каждую цифру на составляющее.
Че та не понял. А как будет выгледит математическая модель
Код:
var A,B,N,i,iA:word;
begin
A:=5;b:=3;N:=11;
for i:=1 to N do
begin
for iA:=0 to i div A do
If (I-Ia*A)mod B=0 then
begin
writeln(i);
Break;
end;
end;
readln;
end.
begin
A:=5;b:=3;N:=11;
for i:=1 to N do
begin
for iA:=0 to i div A do
If (I-Ia*A)mod B=0 then
begin
writeln(i);
Break;
end;
end;
readln;
end.
Ничего отнимать и делить не надо. тут простая динамика. Припустим можно сделать масив розмером N елементов. Изначально они нулевые.
Елементы с индексами А и B устанавливаем в 1.
Бежым по масиву и иля каждого индекса I в котором ненулевое значение устанавляваем елементы с индексами I+A, I+B в единицу, бежым дальше. Если такой масив сделать нельзя используем список.
Код:
var
a, b, n, i: word;
arr: array[0..60000] of byte;
BEGIN
readln(a,b,n);
arr[a] := 1;
arr := 1;
for i := 1 to n do
begin
if (arr = 1) then
begin
writeln(i);
arr[i+a] := 1;
arr[i+b] := 1;
end;
end;
END.
a, b, n, i: word;
arr: array[0..60000] of byte;
BEGIN
readln(a,b,n);
arr[a] := 1;
arr := 1;
for i := 1 to n do
begin
if (arr = 1) then
begin
writeln(i);
arr[i+a] := 1;
arr[i+b] := 1;
end;
end;
END.