Помощь - Поиск - Пользователи - Календарь
Полная версия: вывести последовательности длины n
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Insomnia
Напечатать по 1 разу все последовательности длины n , состоящие из чисел 1..k . Их кол-во находится как k^n.

program nposledov;

{$APPTYPE CONSOLE}

uses
SysUtils,windows;
const n=3;
k=2;
type
TElem=integer;
TArr=array[1..n] of TElem;
TPrr=array[1..k] of TElem;
var
j,i,p: TElem;
Arr: TArr;
Prr: TPrr;

procedure nposled (var Ar:TArr; Pr: TPrr; p: TElem);
var i,j: integer;
begin
if p=n then begin
for i:=1 to n do begin
write(Arr[i])
end;
writeln

end
else begin
for j:=1 to k do begin
p:=p+1;
Ar[p]:=Ar[j];
nposled(Ar,Pr,p);
p:=p-1;
end;
end
end;

begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
p:=0;
writeln('введтие числа, из которых хотите получить последовательности');
for j:=1 to k do
readln(Prr[j]);
nposled(Arr,Prr,p);
readln
end.


Выводятся все послед-ти вкл. парные (11, 666 и т.п.) . Их надо исключить. Не могу понять как это сделать. подскажите пожалуйста.
да и код, чувствуется, очень грязный и неккоректный.

М
Просьба использовать правильные теги.
Исправлено

Lapp
Цитата(Insomnia @ 4.06.2011 3:38) *
Выводятся все послед-ти вкл. парные (11, 666 и т.п.) . Их надо исключить.

Да уж, повторы действительно наблюдаются.. Только не те, о которых ты говорил ))
Running "d:\...\pas\fp\fp110603_insomnia\fp110603_insomnia.exe "
введтие числа, из которых хотите получить последовательности
2
5
000
000
000
000
000
000
000
000

Insomnia
 program nposledov;

{$APPTYPE CONSOLE}

uses
SysUtils,windows;
const n=3;
k=2;
type
TElem=integer;
TArr=array[1..n] of TElem;
TPrr=array[1..k] of TElem;
var
j,i,p: TElem;
Arr: TArr;
Prr: TPrr;

procedure nposled (var Ar:TArr; Pr: TPrr; p: TElem);
var i,j: integer;
begin
if p=n then begin
for i:=1 to n do begin
write(Arr[i])
end;
writeln

end
else begin
for j:=1 to k do begin
p:=p+1;
Ar[p]:=Ar[j];
nposled(Ar,Pr,p);
p:=p-1;
end;
end
end;

begin
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
p:=0;
writeln('введтие числа, из которых хотите получить последовательности');
for j:=1 to k do
readln(Prr[j]);
nposled(Arr,Prr,p);
readln
end.


исправил. теперь выводит что требуется, вкл. парные. надо, что бы включались только те варианты, в которых не будет парных чисел друг с другом. (т.е. 787 - вывести , а 788 - нет)
DarkWishmaster
Цитата(Insomnia @ 4.06.2011 7:43) *



исправил. теперь выводит что требуется, вкл. парные. надо, что бы включались только те варианты, в которых не будет парных чисел друг с другом. (т.е. 787 - вывести , а 788 - нет)


Можно сделать функцию для числа:

Rprec:=0; m:=0;
while n<>0 do begin
r:=n mod 10;
if r<>Rprec then begin //нашли другое число
m:=0;
Rprec:=R;
end
else inc(m);
if m=2 then Parnoe:=True;
n:=n div 10;
end;


Или я не совсем понял что такое парное число.
IUnknown
Цитата
исправил. теперь выводит что требуется, вкл. парные.
Что-то не видно. Выводится все так же 8 троек нулей.

Добавлено через 12 мин.
P.S. А вот так:
procedure nposled (var Ar:TArr; Pr: TPrr; p: TElem);
var i, j: integer;
begin
if p=n then
begin
for i := 1 to n - 1 do
if ar[i] = ar[i+1] then exit;
for i:=1 to n do
begin
write(Ar[i]) // Да, здесь именно AR, а не ARR, как было у тебя
end;
writeln
end
else
begin
for j:=1 to k do
begin
p:=p+1;
Ar[p]:=pr[j]; // Да, здесь именно PR справа, а не AR как было у тебя
nposled(Ar,Pr,p);
p:=p-1;
end;
end
end;
- выводит то, что требуется: ввожу 7 и 8, получаю
787
878
Это требовалось?
Insomnia
да. большое спасибо. разобрался
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.