1. 程式人生 > >在n個數選取m個數中進行全排列

在n個數選取m個數中進行全排列

#include<iostream> 
using namespace std; 
int a[100]; //儲存排列的數
void function(int m,int k) 
{ 
    int i,j; 
    for(i=m;i>=k;i--) 
    { 
        a[k]=i; 
        if(k>1) 
            function(i-1,k-1); 
        else 
        { 
            for(j=a[0];j>0;j--) 
                cout<<a[j]<<"\t"
; cout<<endl; } } } int main() { int n,r; cout<<"請輸入n和r的值:"<<endl; cin>>n>>r; if(r>n) cout<<"輸入n和r的值錯誤!"<<endl; else { a[0]=r; function(n,r); } return 0; }
/*
  @brief
從n個數選取m個數並進行全排列 select(int n,int m) 從n個數中選取m個數 void rank(int m) 對m個數進行全排列 */ #include <stdio.h> #include <stdlib.h> void select(int n,int m); void rank(int k,int m); void swap(int x,int y,int data[]); int value[10]={2,4,5,7,9,12,15,23,46,78}; int data[10]={0}; //選取數存放在這裡(位置從1-m0位置存放選取數的個數m
int arr[10]={0}; //全排列的資料 int count; //資料總數 int size; //排序個數 int main() { count=10; size=2; printf("Hello world!\n"); data[0]=size; select(count,size); return 0; } void select(int n,int m) { int i,j; for(i=n;i>=m;i--) { data[m]=value[i-1]; if(m>1) select(i-1,m-1); else { printf("選取的%d個數如下:\n",data[0]); for(j=data[0];j>0;j--) { printf("%d ",data[j]); arr[j-1]=data[j]; } printf("\n"); printf("對選出的%d個數進行全排列表示如下:\n",data[0]); rank(0,size); } } } void rank(int k,int n) { int i; int j; for(i=k;i<n;i++) { swap(k,i,arr); if(i<n-1) rank(k+1,n); else { for(j=0;j<size;j++) printf("%d ",arr[j]); printf("\n"); } swap(k,i,arr); } } void swap(int x,int y,int data[]) { int temp=data[x]; data[x]=data[y]; data[y]=temp; }