| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3616 人关注过本帖, 1 人收藏
标题:求全排列1-9的一份思路 算法思路,
只看楼主 加入收藏
光头佬
Rank: 1
等 级:新手上路
帖 子:28
专家分:7
注 册:2016-3-25
结帖率:66.67%
收藏(1)
已结贴  问题点数:20 回复次数:10 
求全排列1-9的一份思路 算法思路,
如题,想了两天了,没开始接触算法,在学校里只学了C的一点基础,望有大神想交此算法思路
搜索更多相关主题的帖子: 学校 
2016-03-25 21:02
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:5 
全排列不就是求阶乘么?套会公式就行。
程序代码:
#include <stdio.h>
//A(n,m),m<=n
int f(int n,int m)
{
    int i,a=1,b=1;
    //n!
    for(i=1;i<=n;i++)
    {
        a*=i;
    }
    //(n-m)!
    for(i=1;i<=n-m;i++)
    {
        b*=i;
    }
    
    return a/b;  //n!/(n-m)!
}

int main()
{
    int n=10,m=6;
    printf("A(%d,%d)=%d\n",n,m,f(n,m));
    return 0;
}

   唯实惟新 至诚致志
2016-03-25 21:17
光头佬
Rank: 1
等 级:新手上路
帖 子:28
专家分:7
注 册:2016-3-25
收藏
得分:0 
回复 2楼 qq1023569223
不是求阶乘啊- -,是把 1到9的全排列列出来,论坛上有我也查过,有个一大神自己写的代码我看不太懂,他说一般百度出来的那一个算法不太人性化,然而他写那个我还在研究,所以想请大神给个思路我自己写一遍啊
2016-03-26 09:55
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
有一个好办法,把各个位都不相同的所有9位数列出来。

   唯实惟新 至诚致志
2016-03-26 10:22
luckhide
Rank: 5Rank: 5
来 自:青岛
等 级:职业侠客
帖 子:51
专家分:338
注 册:2016-3-19
收藏
得分:5 
可以从最简单的入手,比如1、2的全排列是12、21,可以发现最根本的方法是两个数的交换,所以将所有数据分细到只有两个数时,将这两个数交换返回即可。递归根据这个思路去做。
排列组合代码是很多公司招聘时必考,想从事码农职业的人应该信手拈来,4楼办法可行,但效率低下,肯定不能通过招聘测试。
2016-03-26 11:11
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
我用递归实现的 1~9 的全排

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>

int cd(int m[],int num1)
{

 int k,l;

 l=0;

 if(num1==8){
    printf("%d%d%d%d%d%d%d%d%d\n",m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8]);
    return 0;

 }

 else{
        cd(m,num1+1);

        l++;
        if((num1+l)<=8){
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        cd(m,num1+1);
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        }

        l++;
        if((num1+l)<=8){
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        cd(m,num1+1);
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        }

         l++;
        if((num1+l)<=8){
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        cd(m,num1+1);
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        }
        
        l++;
        if((num1+l)<=8){
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        cd(m,num1+1);
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        }
        
        l++;
        if((num1+l)<=8){
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        cd(m,num1+1);
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        }

 
        l++;
        if((num1+l)<=8){
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        cd(m,num1+1);
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        } 
        
        l++;
        if((num1+l)<=8){
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        cd(m,num1+1);
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        } 
        
        l++;
        if((num1+l)<=8){
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        cd(m,num1+1);
        k=m[num1];
        m[num1]=m[num1+l];
        m[num1+l]=k;
        }
        
        return 0;

 }
}

int main()
{
    int j,num,i[9];
    num=0;
    for(j=0;j<9;j++)
        i[j]=j+1;
    cd(i,num);
}



[此贴子已经被作者于2016-4-19 04:20编辑过]


其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-19 03:31
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
不用递归的全排
程序代码:
#include <stdio.h>

int _GetNext(int n[])
{
    int i, j, tmp;

    printf("%d%d%d%d%d%d%d%d%d\n", n[0],n[1],n[2],n[3],n[4],n[5],n[6],n[7],n[8]);

    for(i=0; i<8; i++)
    {
        if (n[i] < n[i+1])
        {
            break;
        }
    }

    if (i > 7)
    {
        return 0;
    }

    for (j=0; j<=i; j++)
    {
        if (n[j] < n[i+1])
        {
            tmp = n[j];
            n[j] = n[i+1];
            n[i+1] = tmp;
            break;
        }
    }

    for(j=0; j<=(i/2); j++)
    {
        tmp = n[j];
        n[j] = n[i-j];
        n[i-j] = tmp;
    }

    return 1;
}

int main()
{
    int n[]={1,2,3,4,5,6,7,8,9};
    while (_GetNext(n));
}


2016-04-19 23:41
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
不用递归的我写过

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-04-19 23:47
光头佬
Rank: 1
等 级:新手上路
帖 子:28
专家分:7
注 册:2016-3-25
收藏
得分:0 
回复 8楼 zhulei1978
谢谢了 大哥
2016-04-23 15:12
光头佬
Rank: 1
等 级:新手上路
帖 子:28
专家分:7
注 册:2016-3-25
收藏
得分:0 
回复 5楼 luckhide
恩恩谢了大哥
2016-04-23 15:12
快速回复:求全排列1-9的一份思路 算法思路,
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018768 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved