програма з числами

Ответить
topo
Сообщения: 20
Зарегистрирован: 17 мар 2010, 11:31

Помогите пожалуста
задание
Перечислить все возростающие последовательности длины k из чисел 1....n в лексографическом порядке. (Пример
при n=5, k=2 получаєм 12 13 14 15 23 24 25 34 35 45)

Решение
Минимальной будет последовательность (12...k); максимальной ((n-k+1)...(n-1)n). s-й член последовательности можна увеличивать если он меньше n-k+s. После увеличения s-го элемента все следующие должны возростать с шагом 1.

Алгоритм
s:=n;
while not (x[s]<n-k+s) do begin
{
s:=s-1;
}
end;

// s - номер єлемента подлежащего увеличению

x[s]:=x[s]+1;
for i := (s+1) to n do begin
{
x :=x[i-1]+1;
}
end;
Аватара пользователя
rrrFer
Сообщения: 237
Зарегистрирован: 07 сен 2008, 14:15
Контактная информация:

Код: Выделить всё

/*Перечислить все возрастающие последовательности длины k из чисел 1....n в лексикографическом порядке*/
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
void f(int n,int k,int t, char s[255],int st){
	int i;
	if(!k){
		s[t]=0;
		cout<<s<<endl;
	}
	else
		for(i=st;i<=n;i++){
			s[t]=48+i;
			f(n,k-1,t+1,s,i+1);
		}
}
int main(){
	int n,k;
	char *buff;
	buff=new char[255];
	cout<<"k: ";
	cin>>k;
	cout<<"n: ";
	cin>>n;
	f(n,k,0,buff,1);
	cout<<endl<<"press <enter> to continue: ";
	cin.get(),cin.get();
	return 0;
}
Вроде бы работает, но ИМХО написано криво : ))
Возрастающие и лексикографический
Приглашаю на свой блог о программировании: pro-prof.com
Ответить