算法-输入一个整数,如何实现其全排列。

问题描述

输入一个整数,如何实现其全排列。

具体地说,就是输入一个正整数,目前限定为n为1到10之间。全排列指
如果输入3,则输出123,132,213,231,312,321。
如何实现?假如输入9,则有9×8×7×6×5×4×3×2种情况。

解决方案

 #include<iostream>
using namespace std;
void Permutation(char* pStr, char* pBegin);   

void permutation(char* pStr)
{
      Permutation(pStr, pStr);
}  

void Permutation(char* pStr, char* pBegin)
{
    if(!pStr || !pBegin)
        return;  

    if(*pBegin == '')
    {
        printf("%sn", pStr);
    }
    else
    {
        for(char* pCh = pBegin; *pCh != ''; ++ pCh)
        {
            // swap pCh and pBegin
            char temp = *pCh;
            *pCh = *pBegin;
            *pBegin = temp;  

            Permutation(pStr, pBegin + 1);
            // restore pCh and pBegin
            temp = *pCh;
            *pCh = *pBegin;
            *pBegin = temp;
        }
    }
} 

int main()
{
    char str[] ={'1','2','3',''};
    permutation(str);
    getchar();
    return 0;
}

在线运行:

http://codepad.org/pTA0yiRn

123
132
213
231
321
312

解决方案二:

就是1—n,n个数经行排列组合。for循环n次,每次依次选一个数,选过的数不能再选。

解决方案三:

自己来,比起一楼的方法无疑更麻烦一点。

```public class 全排列 {

public static String[] strs;
public static String str;
public static Random rand;

public static void main(String[] args) {
Set set = totalRank(9);
for (String rank : set) {
System.out.println(rank);
}
// System.out.println();
}

public static Set totalRank(int n) {
    str = genereatString(n);
    Set<String> set = new HashSet<String>();
    do {
        if (set.contains(str)) {
            str = genereatString(n);
        } else {
            set.add(str);
        }
    } while (set.size() != calFactorial(n));
    return set;
}

//计算阶乘
public static int calFactorial(int n) {
    int sum = 1;
    for (int i = 1; i <= n; i++) {
        sum *= i;
    }
    return sum;
}

/**
 * 生成一个数组包含"1","2","3","4","5" 5个字符串
 */
public static String[] generatearr(int n) {
    String[] strs = new String[n];
    for (int i = 0; i < n; i++) {
        strs[i] = "" + (i + 1);
    }
    return strs;
}
/**
 * 生成一个排列 ,每次随机取一个整数(0,1,2,3,4)取过了的就不再取,
 直到取到5个。每一个数字代表一个字符串数组中的字符串。
 */
public static String genereatString(int n) {
    strs = generatearr(n);
    rand = new Random();
    String s = "";
    Set nums = new HashSet();
    Integer a1;
    for (int i = 0; i < n;) {
        a1 = rand.nextInt(n);
        if (nums.contains(a1)) {
            a1 = rand.nextInt(n);
        } else {
            s += strs[a1];
            nums.add(a1);
            i++;
        }
    }
    return s;
}

}```

当n=9时,运行了半分钟才出来结果。如果这种算法可行,那么如何去优化呢?总感觉效率不够高。

时间: 2024-11-07 18:52:49

算法-输入一个整数,如何实现其全排列。的相关文章

求教:编写一个函数,在页面输入一个整数,打印出对应的乘法表

问题描述 求教:编写一个函数,在页面输入一个整数,打印出对应的乘法表 函数会写,就是不知道怎么在页面输入整数来打印出乘法表,哪位可以帮忙给看看啊 解决方案 void show() { for (int i = 1; i < 10; i++) { for (int j = 1; j <=i;j++) { Response.Write(j + " * " + i + " = " + i * j+"t"); } Response.Write

python输入一个整数N,输出N的所有最小因子

题目:输入一个整数N,输出N的所有最小因子,也称素因子. 其中,任何一个大于1的数,都可以写成多个素数的乘积,我们把这些素数叫做这个数素因子. 例如: 输入:120 输出:2 2 2 3 5 输入:27 输出:3 3 3 python求解素因子代码如下: # -*- coding:utf-8 -*- def isprime(num): count = num / 2 while count >1: if num % count == 0: return False break else: cou

代码-新手求教,对于每组数据,每行输出一个整数,为最短花费时间。

问题描述 新手求教,对于每组数据,每行输出一个整数,为最短花费时间. 麻婆豆腐是小奏最爱的食物,为了做出最上等的麻婆豆腐,小奏准备了若干上等的食材,并且获得了传说中的麻婆豆腐的料理方法:每次将两种食材合二为一,成为一种新的食材,直到所有的食材都合并到一起,传说中的麻婆豆腐就做成了! 然而,每种食材都有不同的料理难度,每次料理两种食材所需的时间是两种食材料理难度相加:而合二为一的新食材料理难度也是两种食材的料理难度相加. 输入要求 数据有多组输入,第一行输入一个整数n(1<=n<=100),表示

java 输入一个数字,反转输出这个数字的值(实现方法)_java

如下所示: package 第四天; import java.util.Scanner; public class 数字反转 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个整数:"); int num=sc.nextInt(); int result=0;//存反转的数字 while(true) { int n=num%10

求解:编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。

问题描述 求解:编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数. #include #include #include int main(void) { int i; while(scanf("%d",i)) { for(int j=1;j<=i;j++) { for(int k=1;k<j;k++) { if(j%k==0) continue; else goto line; } line: printf("there are %d"

c++-编写一个函数,对输入的整数k输出它的全部素数因子。……格式为126=2*3*3*7

问题描述 编写一个函数,对输入的整数k输出它的全部素数因子.--格式为126=2*3*3*7 解决方案 不知道你的编译器是什么,如果只是输出格式不对,就加一句: #include"iostream" using namespace std; #include<math.h> void main() { int x,i; cout<<"输入整数:"; cin>>x; cout<<x<<"="

c语言-输入一个十进制整数,依次转换成2到16进制数

问题描述 输入一个十进制整数,依次转换成2到16进制数 求大神帮帮忙做一下 我刚刚学C语言 程序代码 弄了好久都没弄出来 大神帮忙编一个程序代码 ,谢谢了 解决方案 #include <iostream> using namespace std; char metachar[] = "0123456789abcdef"; void tobasen(int x, int n) { if (x > 0) { tobasen(x / n, n); cout <<

输入一个字符串,取出其中的整数(实现代码)_C 语言

题目:输入一个字符串,内含所有数字和非数字字符.将其中连续的数字作为一个整数,依次存放到一个数组中,统计共有多少个整数,并输出这些数. 复制代码 代码如下: #include<iostream>using namespace std;int main(){    int a[30]={0};    char str[200];    cout<<"请输入一个含有数字的字符串\n"<<endl;    cin>>str;    bool f

OJ题:输入一个多位的数字,求各数位相加。

题目内容: 输入一个多位的数字,1求各数位相加. 例如输入12345,则计算1+2+3+4+5=15 输入格式: 一个整数 输出格式: 一个整数 输入样例: 1234567890 输出样例: 45 时间限制:500ms内存限制:32000kb 实现程序: #include <stdio.h> #include <stdlib.h> #include <string.h> int cnt_count(int value) { int count = 0 , cnt = 0