![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Ольга |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Женский Реальное имя: Оля Репутация: ![]() ![]() ![]() |
Вводится некоторое натуральное число N, состоящее не более чем из 8 различных цифр (первая – не 0). Определить, сколько существует различных чисел, больших N и составленных из тех же цифр (и в тех же количествах), что и N.
|
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Насколько я понимаю, твою задачу можно привести к следующему:
1) по заданной перестановке найти ее номер в списке перестановок, упорядоченных лексикографически; 2) определить общее число перестановок, возможное с заданными цифрами; 3) вычесть из второго числа первое (пользуясь тем, что лексикографически упорядоченные перестановки с бОльшими номерами будут давать бОльшие числа). Тогда тебе сюда: http://alglib.sources.ru/combinatorial/permutations.php Сообщение отредактировано: volvo - |
Ольга |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Женский Реальное имя: Оля Репутация: ![]() ![]() ![]() |
Большое спасобо за совет. Только помогите практически решить эту задачуб так как в указанной ссылке нет Паскаля, только Делфи и СИ. Буду очень благодарна за Вашу помощь.
Оля. |
Гость |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата в указанной ссылке нет Паскаля, только Делфи и СИ В программе, на Дельфи, приведенной по ссылке, нет ничего, что не компилировалось бы в Паскале... (
var x : TInteger1DArray
можно заменить на
var X: array of integer
) |
Ольга |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Женский Реальное имя: Оля Репутация: ![]() ![]() ![]() |
Все так и сделала - заменила var x : TInteger1DArray на var X: array of integer. Но там описана только функция, а не знаю куда вставить тело цикла. Пожалуйста, помоги доделать программу.
|
samec |
![]()
Сообщение
#6
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Реальное имя: Юра Репутация: ![]() ![]() ![]() |
вот что получилось у меня
program perm;
uses CRT;
var
i,n,kol:Longint;
x:array[1..8] of integer;
function NextPermutation:Boolean;
var
k : Integer;
t : Integer;
y : Integer;
begin
{ //
// Check
//}
if N<=0 then
begin
NextPermutation := False;
Exit;
end;
K:=1;
while K<=N do
begin
if (X[K]<1) or (X[K]>N) then
begin
NextPermutation := False;
Exit;
end;
Inc(K);
end;
{ //
// Process
//}
k := n-1;
while k>0 do
begin
if x[k]<=x[k+1] then
begin
Break;
end;
k := k-1;
end;
if k<>0 then
begin
t := k+1;
while t<n do
begin
if x[t+1]<=x[k] then
begin
Break;
end;
t := t+1;
end;
y := x[k];
x[k] := x[t];
x[t] := y;
t := 0;
while t<(n-k) div 2 do
begin
y := x[n-t];
x[n-t] := x[k+1+t];
x[k+1+t] := y;
t := t+1;
end;
NextPermutation := True;
end
else
begin
NextPermutation := False;
end;
end;
begin
write('Введите n:');
readln(n);
kol:=0;
for i:=1 to n do
begin
write('введите ',i,'-ую цифру числа: ');
readln(x[i]);
end;
clrscr;
write('заданное число: ');
for i:=1 to n do
write(x[i]);
writeln;
writeln;
while (NextPermutation) do
begin
inc(kol);
write(kol,'-ое число: ');
for i:=1 to n do
write(x[i]);
writeln;
end;
writeln('Итого ',kol,' чисел больше заданного');
write('Нажмите любую клавишу для выхода...');
readkey;
end.
|
Ольга |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Женский Реальное имя: Оля Репутация: ![]() ![]() ![]() |
Что-то у меня не получается с этой программой. В числе должно быть не более 8 цифр, а программа согласно этой строке write('введите ',i,'-ую цифру числа: '); запрашивает 14 раз 'введите 1-ую цифру числа' и так до 14 раз (хотя, например, ввожу число из 3-х цифр).
|
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Вот так попробуй:
function Fact(n: integer): longint;
var
i: integer;
T: longint;
begin
T := 1;
for i := 1 to n do T := T * i;
Fact := T;
end;
function PermutationNum(const A : array of integer; N : Integer): longint;
var
T, i, j: integer;
F: longint;
theResult: longint;
begin
if N <= 0 then begin
PermutationNum := 0; Exit;
end;
I:=1;
while I <= N do begin
if (A[I]<1) or (A[I]>N) then begin
PermutationNum := 0; Exit;
end;
Inc(I);
end;
theResult := 0;
F := 1;
I := 1;
while I <= N do begin
F := F*I;
Inc(I);
end;
I := 1;
while I <= N-1 do begin
F := F div (N+1-I);
T := A[I]-1;
J := 1;
while J <= I-1 do begin
if A[J]<A[I] then begin
T := T-1;
end;
Inc(J);
end;
theResult := theResult + F*T;
Inc(I);
end;
theResult := theResult + 1;
PermutationNum := theResult;
end;
const
n: integer = 3;
var
arr: array[0 .. 8] of integer;
s: string;
i: integer;
p, total: longint;
begin
write('n = '); readln(n);
write('number[', n, ' chars] = '); readln(s);
arr[0] := 0;
for i := 1 to n do arr[i] := ord(s[i]) - ord('0');
p := PermutationNum(arr, n);
total := Fact(n);
writeln(total - p);
end.
(вводишь сначала n - не больше 8, потом в виде строки само число из n цифр...)Сообщение отредактировано: volvo - |
samec |
![]()
Сообщение
#9
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 180 Пол: Мужской Реальное имя: Юра Репутация: ![]() ![]() ![]() |
Что-то у меня не получается с этой программой. В числе должно быть не более 8 цифр, а программа согласно этой строке write('введите ',i,'-ую цифру числа: '); запрашивает 14 раз 'введите 1-ую цифру числа' и так до 14 раз (хотя, например, ввожу число из 3-х цифр). значит просто ввела n равное не трём, а четырнадцати. у меня вот как программа работает: Введите n:3 введите 1-ую цифру числа: 1 введите 2-ую цифру числа: 2 введите 3-ую цифру числа: 3 заданное число: 123 1-ое число: 132 2-ое число: 213 3-ое число: 231 4-ое число: 312 5-ое число: 321 Итого 5 чисел больше заданного Нажмите любую клавишу для выхода... Сообщение отредактировано: samec - |
Ольга |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 15 Пол: Женский Реальное имя: Оля Репутация: ![]() ![]() ![]() |
Большое спасибо, все правильно работает!!!
Оля |
![]() ![]() |
![]() |
Текстовая версия | 21.04.2025 17:54 |