回 帖 发 新 帖 刷新版面

主题:求助各位老大,请问从0--9中取7个号码有几种排列法,可以重复.怎么把具体排列写这道题我做了很久了.

从0--9中随意选取7个数字,请问有几种排法,怎么才能把具体排出来.这题我想了很久也没做出来,跪求各位大哥帮忙,不然老师要说我了[em10]

回复列表 (共12个回复)

沙发

回家翻翻组合数学找一下算法

板凳

组合数学里面的经典算法:
#include <stdio.h>
#include <malloc.h>
int adjust(int a[], int n, int r);
int main(void)
{
    int i,count,m;
    int  n = 10, r = 7;
    int  * a = (int*) malloc( (n + 1) * sizeof(int) );
    for(i = 1; i <= n; i++)
    {
        a[i] = i  ;
    }
    count = 1;
    i = n;
    while(i > n - r)
        count *= i--;
    i = r;
    while(i >= 1)
        count /= i--;
    m = count;
    while(1)
    {
        for(i = 1; i < r; i++)
        {
            printf("%d, ", a[i] - 1);
        }
        
        printf("%d\n", a[r] - 1);
        
        if(--count <= 0)
        {
            break;
        } 
        adjust(a, n , r);
    }
    printf("Total groups: %d\n", m);
}
int adjust(int a[], int n, int r)
{
    int i,j;
    for(i = r; i >= 1 ; i--)
    {
        if(a[i] < n - r + i)
        {
            j = i;
            break;
        }
    }
    a[j] = a[j] + 1;
    for( i =  j + 1; i <= r; i++)
        a[i] = a[i-1] + 1;  
    return 1;
}

3 楼

运行结果:
0, 1, 2, 3, 4, 5, 6
0, 1, 2, 3, 4, 5, 7
0, 1, 2, 3, 4, 5, 8
0, 1, 2, 3, 4, 5, 9
0, 1, 2, 3, 4, 6, 7
0, 1, 2, 3, 4, 6, 8
0, 1, 2, 3, 4, 6, 9
0, 1, 2, 3, 4, 7, 8
0, 1, 2, 3, 4, 7, 9
0, 1, 2, 3, 4, 8, 9
0, 1, 2, 3, 5, 6, 7
0, 1, 2, 3, 5, 6, 8
0, 1, 2, 3, 5, 6, 9
0, 1, 2, 3, 5, 7, 8
0, 1, 2, 3, 5, 7, 9
0, 1, 2, 3, 5, 8, 9
0, 1, 2, 3, 6, 7, 8
0, 1, 2, 3, 6, 7, 9
0, 1, 2, 3, 6, 8, 9
0, 1, 2, 3, 7, 8, 9
0, 1, 2, 4, 5, 6, 7
0, 1, 2, 4, 5, 6, 8
0, 1, 2, 4, 5, 6, 9
0, 1, 2, 4, 5, 7, 8
0, 1, 2, 4, 5, 7, 9
0, 1, 2, 4, 5, 8, 9
0, 1, 2, 4, 6, 7, 8
0, 1, 2, 4, 6, 7, 9
0, 1, 2, 4, 6, 8, 9
0, 1, 2, 4, 7, 8, 9
0, 1, 2, 5, 6, 7, 8
0, 1, 2, 5, 6, 7, 9
0, 1, 2, 5, 6, 8, 9
0, 1, 2, 5, 7, 8, 9
0, 1, 2, 6, 7, 8, 9
0, 1, 3, 4, 5, 6, 7
0, 1, 3, 4, 5, 6, 8
0, 1, 3, 4, 5, 6, 9
0, 1, 3, 4, 5, 7, 8
0, 1, 3, 4, 5, 7, 9
0, 1, 3, 4, 5, 8, 9
0, 1, 3, 4, 6, 7, 8
0, 1, 3, 4, 6, 7, 9
0, 1, 3, 4, 6, 8, 9
0, 1, 3, 4, 7, 8, 9
0, 1, 3, 5, 6, 7, 8
0, 1, 3, 5, 6, 7, 9
0, 1, 3, 5, 6, 8, 9
0, 1, 3, 5, 7, 8, 9
0, 1, 3, 6, 7, 8, 9
0, 1, 4, 5, 6, 7, 8
0, 1, 4, 5, 6, 7, 9
0, 1, 4, 5, 6, 8, 9
0, 1, 4, 5, 7, 8, 9
0, 1, 4, 6, 7, 8, 9
0, 1, 5, 6, 7, 8, 9
0, 2, 3, 4, 5, 6, 7
0, 2, 3, 4, 5, 6, 8
0, 2, 3, 4, 5, 6, 9
0, 2, 3, 4, 5, 7, 8
0, 2, 3, 4, 5, 7, 9
0, 2, 3, 4, 5, 8, 9
0, 2, 3, 4, 6, 7, 8
0, 2, 3, 4, 6, 7, 9
0, 2, 3, 4, 6, 8, 9
0, 2, 3, 4, 7, 8, 9
0, 2, 3, 5, 6, 7, 8
0, 2, 3, 5, 6, 7, 9
0, 2, 3, 5, 6, 8, 9
0, 2, 3, 5, 7, 8, 9
0, 2, 3, 6, 7, 8, 9
0, 2, 4, 5, 6, 7, 8
0, 2, 4, 5, 6, 7, 9
0, 2, 4, 5, 6, 8, 9
0, 2, 4, 5, 7, 8, 9
0, 2, 4, 6, 7, 8, 9
0, 2, 5, 6, 7, 8, 9
0, 3, 4, 5, 6, 7, 8
0, 3, 4, 5, 6, 7, 9
0, 3, 4, 5, 6, 8, 9
0, 3, 4, 5, 7, 8, 9
0, 3, 4, 6, 7, 8, 9
0, 3, 5, 6, 7, 8, 9
0, 4, 5, 6, 7, 8, 9
1, 2, 3, 4, 5, 6, 7
1, 2, 3, 4, 5, 6, 8
1, 2, 3, 4, 5, 6, 9
1, 2, 3, 4, 5, 7, 8
1, 2, 3, 4, 5, 7, 9
1, 2, 3, 4, 5, 8, 9
1, 2, 3, 4, 6, 7, 8
1, 2, 3, 4, 6, 7, 9
1, 2, 3, 4, 6, 8, 9
1, 2, 3, 4, 7, 8, 9
1, 2, 3, 5, 6, 7, 8
1, 2, 3, 5, 6, 7, 9
1, 2, 3, 5, 6, 8, 9
1, 2, 3, 5, 7, 8, 9
1, 2, 3, 6, 7, 8, 9
1, 2, 4, 5, 6, 7, 8
1, 2, 4, 5, 6, 7, 9
1, 2, 4, 5, 6, 8, 9
1, 2, 4, 5, 7, 8, 9
1, 2, 4, 6, 7, 8, 9
1, 2, 5, 6, 7, 8, 9
1, 3, 4, 5, 6, 7, 8
1, 3, 4, 5, 6, 7, 9
1, 3, 4, 5, 6, 8, 9
1, 3, 4, 5, 7, 8, 9
1, 3, 4, 6, 7, 8, 9
1, 3, 5, 6, 7, 8, 9
1, 4, 5, 6, 7, 8, 9
2, 3, 4, 5, 6, 7, 8
2, 3, 4, 5, 6, 7, 9
2, 3, 4, 5, 6, 8, 9
2, 3, 4, 5, 7, 8, 9
2, 3, 4, 6, 7, 8, 9
2, 3, 5, 6, 7, 8, 9
2, 4, 5, 6, 7, 8, 9
3, 4, 5, 6, 7, 8, 9
Total groups: 120
Press any key to continue

4 楼


辛苦老大了,可你的公式我有些看不懂,请问到底有几种排法啊

5 楼

不是全部给你输出了吗,这是组合算法,你自己查书去看吧,全排列也有的,我以前写过的,自己研究把,有点难!

6 楼


谢谢老大了,辛苦了,我去看看书,有不懂的再向您请教

7 楼

做个链接吧。

我推荐的两种算法:

1、求所有组合,实际上就是求它的幂集(所有子集),直接用二进制的方法:

#include <iostream>
using namespace std;

#define MAX 32
typedef unsigned long DWORD;

//:global
char g_szElem[MAX+1];
DWORD g_nLength;

void Print(DWORD);

void main()
{
    cout<<"Input a string(LEN<=32):"<<endl;
    cin>>g_szElem;
    g_nLength=strlen(g_szElem);
    DWORD nMaxCo=((DWORD)1<<g_nLength);
    for(DWORD nCount=0;nCount<nMaxCo;++nCount)
        Print(nCount);
}

void Print(DWORD nNow)
{
    cout<<"No."<<(nNow+1)<<" {";
    for(DWORD nIndex=0;nIndex<g_nLength;++nIndex)
        if(nNow & (1<<nIndex))
            cout<<g_szElem[nIndex];
    cout<<"}"<<endl;
}

2、求排列就用深搜

#define LEN 5
#define VISITED 1
#define UNVISITED 0
char elem[LEN+1]="abcde";
char s[LEN+1];
int v[LEN]={0};
void outputs();
void dfs(int c)
{
   if(c==LEN)
      outputs();
   else
   {
      for(int i=0;i<LEN;++i)
         if(v[i]==UNVISITED)
         {
            s[c]=elem[i];
            v[i]=VISITED;
            dfs(c+1);
            v[i]=UNVISITED;
         }
   }
}
void outputs()
{
   s[LEN]=0;
   printf("%s\n",s);
}
void main()
{
   dfs(0);
}

8 楼

哦天啦,还可以重复使用,那更简单,修改上面的得到

#define LEN 5
//#define VISITED 1
//#define UNVISITED 0
char elem[LEN+1]="abcde";
char s[LEN+1];
//int v[LEN]={0};
void outputs();
void dfs(int c)
{
   if(c==LEN)
      outputs();
   else
   {
      for(int i=0;i<LEN;++i)
         //if(v[i]==UNVISITED)
         {
            s[c]=elem[i];
            //v[i]=VISITED;
            dfs(c+1);
            //v[i]=UNVISITED;
         }
   }
}
void outputs()
{
   s[LEN]=0;
   printf("%s\n",s);
}
void main()
{
   dfs(0);
}

9 楼

不好意思,上面的程序没调过,我把调好的发上来

#include<stdio.h>
#define LEN 10
#define DISPLAY_LEN 7
#define VISITED 1
#define UNVISITED 0
char elem[LEN+1]="0123456789";
char s[DISPLAY_LEN+1];
int si[DISPLAY_LEN+1];
int v[LEN]={0};
int count=0;
void outputs();
void dfs(int c)
{
    if(c==DISPLAY_LEN)
        outputs();
    else
    {
        for(int i=(c==0?0:si[c-1]+1);i<LEN;++i)
            if(v[i]==UNVISITED)
            {
                s[c]=elem[i];
                si[c]=i;
                v[i]=VISITED;
                dfs(c+1);
                v[i]=UNVISITED;
            }
    }
}
void outputs()
{
    s[DISPLAY_LEN]=0;
    printf("No.%d %s\n",(++count),s);
}
void main()
{
    dfs(0);
}

/////////////结果/////////////

No.1 0123456
No.2 0123457
No.3 0123458
No.4 0123459
No.5 0123467
No.6 0123468
No.7 0123469
No.8 0123478
No.9 0123479
No.10 0123489
No.11 0123567
No.12 0123568
No.13 0123569
No.14 0123578
No.15 0123579
No.16 0123589
No.17 0123678
No.18 0123679
No.19 0123689
No.20 0123789
No.21 0124567
No.22 0124568
No.23 0124569
No.24 0124578
No.25 0124579
No.26 0124589
No.27 0124678
No.28 0124679
No.29 0124689
No.30 0124789
No.31 0125678
No.32 0125679
No.33 0125689
No.34 0125789
No.35 0126789
No.36 0134567
No.37 0134568
No.38 0134569
No.39 0134578
No.40 0134579
No.41 0134589
No.42 0134678
No.43 0134679
No.44 0134689
No.45 0134789
No.46 0135678
No.47 0135679
No.48 0135689
No.49 0135789
No.50 0136789
No.51 0145678
No.52 0145679
No.53 0145689
No.54 0145789
No.55 0146789
No.56 0156789
No.57 0234567
No.58 0234568
No.59 0234569
No.60 0234578
No.61 0234579
No.62 0234589
No.63 0234678
No.64 0234679
No.65 0234689
No.66 0234789
No.67 0235678
No.68 0235679
No.69 0235689
No.70 0235789
No.71 0236789
No.72 0245678
No.73 0245679
No.74 0245689
No.75 0245789
No.76 0246789
No.77 0256789
No.78 0345678
No.79 0345679
No.80 0345689
No.81 0345789
No.82 0346789
No.83 0356789
No.84 0456789
No.85 1234567
No.86 1234568
No.87 1234569
No.88 1234578
No.89 1234579
No.90 1234589
No.91 1234678
No.92 1234679
No.93 1234689
No.94 1234789
No.95 1235678
No.96 1235679
No.97 1235689
No.98 1235789
No.99 1236789
No.100 1245678
No.101 1245679
No.102 1245689
No.103 1245789
No.104 1246789
No.105 1256789
No.106 1345678
No.107 1345679
No.108 1345689
No.109 1345789
No.110 1346789
No.111 1356789
No.112 1456789
No.113 2345678
No.114 2345679
No.115 2345689
No.116 2345789
No.117 2346789
No.118 2356789
No.119 2456789
No.120 3456789

10 楼

看rickone
大哥的贴就是有收获啊!

我来回复

您尚未登录,请登录后再回复。点此登录或注册