定义两个函数 分别输出m个数中n个数的排列 与组合,该怎么处理

定义两个函数 分别输出m个数中n个数的排列 与组合
例如 1 2 3 这三个数 两个数的排列与组合
排列: 1 2; 1 3;2 1; 2 3;3 1;3 3;
组合:1 2; 1 3; 2 3;
 

跪求编程原理 注意 是原理啊 即使没有代码 也行!!! 我要的是方法!!1

------解决方案--------------------
C/C++ code

#include <stdio.h>
#include <stdlib.h>

bool find_arr( int a[], int length , int value )
{
    for( int i = 0; i < length; ++i )
    {
        if( a[i] == value )
            return true;
    }
    return false;
}
int main()
{
    int len;
    int *arr;
    int i = 0, j = 0;
    printf("input the array numbers: ");
    scanf("%d",&len);
    arr = new int[len];
    for( i = 0; i < len; ++i )
    {
        printf("input the %d number: ",i + 1);
        scanf("%d",&arr[i]);
    }
    printf("排列:");
    for( i = 0; i < len; ++i )
    {
        for( j = 0; j < len; ++j )
        {
            if( arr[i] != arr[j] )
            {
                printf("%d  %d ;",arr[i],arr[j]);
            }
        }
    }
    printf("\n组合:");
    for( i = 0; i < len; ++i )
    {
        for( j = i + 1; j < len; ++j )
        {
            printf("%d  %d ;",arr[i],arr[j]);
        }
    }
    printf("\n");
    return 0;
}

------解决方案--------------------
探讨

C/C++ code

#include <stdio.h>
#include <stdlib.h>

bool find_arr( int a[], int length , int value )
{
for( int i = 0; i < length; ++i )
{
if( a[i] == value )
return true……

------解决方案--------------------
C/C++ code

/*
求(1...m)中,n个数的组合
本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。     
   首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。     
   然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,
   同时将其左边的所有“1”全部移动到数组的最左端。     
   当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。   
  
   例如求5中选3的组合:     
   1    1    1    0    0    //1,2,3  
   1    1    0    1    0    //1,2,4 
   1    0    1    1    0    //1,3,4 
   0    1    1    1    0    //2,3,4  
   1    1    0    0    1    //1,2,5    
   1    0    1    0    1    //1,3,5     
   0    1    1    0    1    //2,3,5    
   1    0    0    1    1    //1,4,5     
   0    1    0    1    1    //2,4,5     
   0    0    1    1    1    //3,4,5   
*/
#include <stdio.h>
#include <malloc.h>
//输出
void output(int *num, int m)
{
    int i;
    for(i = 0; i < m; ++i)
        if(*(num+i) == 1)
            printf("%d  ", i+1);
    printf("\n");

}
//检测n个“1”是否全部移动到最右端
//是则返回1
int check(int *num, int m, int n)
{
    int i, flag = 1;
    for(i = m-1; i > m-n-1; --i)
    {
        if(*(num+i) == 0)
        {
            flag = 0;
            break;
        }
    }
    return flag;
}
void chooseNum(int m, int n)
{
    int *num, i, j, count;
    num = (int*)malloc(sizeof(int)*m);
    for(i = 0; i < n; ++i)//前n个元素置1
        *(num+i) = 1;
    if(m == n)
    {
        output(num, m);
        return;
    }
    for(i = n; i < m; ++i)//后面m-n个元素置0
        *(num+i) = 0;
    output(num, m);
    while(1)
    {
        count = 0;

        //找到第一个“10”组合后将其变为“01”组合
        for(i = 0; i < m-1; ++i)
        {
            if(*(num+i) == 1 && *(num+i+1) == 0)
            {
                *(num+i) = 0;
                *(num+i+1) = 1;
                break;
            }
            if(*(num+i) == 1)
                ++count;
        }

        //将其左边的所有“1”全部移动到数组的最左端
        for(j = 0; j < i; ++j)
        {
            if(j < count)
                *(num+j) = 1;
            else
                *(num+j) = 0;
        }
        output(num, m);
        if(check(num, m, n) == 1)
            break;
    }
    free(num);
    
}
int main()
{
    int m = 3, n = 2;
    //scanf("%d%d", &m, &n);
    chooseNum(m, n);
    return 0;
}