求n个数的排列

如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种。如:给定 A、B、C三个不同的字符,则结果为:ABC、ACB、BAC、BCA、CAB、CBA一共3!=3*2=6种情况。

public class Test6 {

//设置总数
private static int count =0;
public static void main(String[] args) {

//获取
Scanner s = new Scanner(System.in);
int n = s.nextInt();
Vector<Character> sources = new Vector<Character>();
Vector<Character> results = new Vector<Character>();
//将获取的数据放入栈
for (int i = 0; i <n; i++) {
sources.add((char) (‘A‘+i));
}
//调用自定义方法,计算总数和输出结果
count(sources, results);

//输出符合排列的总数
System.out.println(count);
}
public static void count(Vector<Character> v1,Vector<Character> v2){

//如果v1的长度为0就输出结果因为数据已经全部取出
if(v1.size()==0){
for (int i = 0; i < v2.size(); i++) {
System.out.print(v2.elementAt(i));
}
System.out.print("\n");
count++;
return;
}
for (int i = 0; i < v1.size(); i++) {
//设置两个缓存栈,用于回调函数是作为参数
Vector<Character>tsourse=new Vector<Character>(v1);
Vector<Character>tresult=new Vector<Character>(v2);
//将剩余的数依次添加进矢量中
tresult.add(v1.elementAt(i));

//并移除队列中的当前元素
tsourse.remove(i);

//回调函数
count(tsourse, tresult);
}
}
}

注:主要考察的是递归

如果需要输出的是含重复的数据是可以改为

public static void count(Vector<Character> v1,Vector<Character> v2){
if(v2.size()==v1.size()){
for (int i = 0; i < v2.size(); i++) {
System.out.print(v2.elementAt(i));
}
System.out.print("\n");
count++;
return;
}
 for (int i = 0; i < v1.size(); i++) {
//设置两个缓存栈
Vector<Character>tsourse=new Vector<Character>(v1);
Vector<Character>tresult=new Vector<Character>(v2);
//当
System.out.println(i);
tresult.add(v1.elementAt(i));
//tsourse.remove(i);
count(tsourse, tresult);
}
}

原文地址:https://www.cnblogs.com/plas/p/9893350.html

时间: 2024-10-12 11:25:52

求n个数的排列的相关文章

输入一个数,求这个数重新排列最大数和最小数之差

#include <stdio.h> #include <string.h> int next_num(int x) { char s[10]; int a,b,n; sprintf(s,"%d",x); n=strlen(s); for (int i=0; i<n; i++) { for (int j=i; j<n; j++) { if (s[i]>s[j]) { char t=s[i]; s[i]=s[j]; s[j]=t; } } } s

leetcode排列,求第k个排列

stl 中的下一个排列在写一遍忘了 写个1个多小时,使用递归写的,错误就在我使用一个list保存当前剩下的数,然后利用k/(n-1)!的阶乘就是删除的数字,但进过观察, 比如 list={1,2,3} 分成3组: 1  {2,3} 2 {1,3} 3 {1,2} 确定位于哪个组,然后确定位于哪个组的第几个nyoj 511. 求第3个排列   ,3%2=1,删除 list就是第3个数3,其实呢是第2个树2 ,所以   计算方法为 (k-1)/(n-1)! 另外一个对于下一组,k%(n-1)!也不行

数学:求一个数的真约数(因数)的个数及所有约数之和

一. 我们知道,每个自然数(不包括0和1)都有2个以上的因数,因数最少的是质数(也叫素数),质数的因数是1和它本身.非质数的自然数也叫合数,它们都含有3个以上(含3个)的因数. 1.怎样求一个数有多少个因数? 对于一个已知的自然数,要求出它有多少个因数,可用下列方法: 首先将这个已知数分解质因数,将此数化成几个质数幂的连乘形式,然后把这些质数的指数分别加一,再相乘,求出来的积就是我们要的结果. 例如:求360有多少个因数. 因为360分解质因数可表示为:360=2^3×3^2×5,2.3.5的指

写一个方法,求两个数的最大公约数和最小公倍数。

package homework0702; /* * 最大公约数 利用辗转相除法求解两个正整数的最大公约数 在循环中,只要除数不等于0,用较大的数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环较小的数,如此循环直到较小的数值为0,返回较大的数.即为最大公约数. 辗转相除法(欧几里得算法) 定理:两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数.最大公约数(greatest common divisor)缩写为gcd. 最小公倍数 最小公倍数 = (a

求两个数的最大公约数

求两个数的最大公约数 问题:给定两个正整数a和b,求他们的最大公约数. 最简单的方法就是穷举法,如果a>b,那么依次计算1~b的所有整数是否是a和b的公约数. public static void main(String[] args) { long timer = System.currentTimeMillis(); System.out.println(getGCB(1000234234,1242342390)); System.out.println(System.currentTime

求两个数的最大公约数和最小公倍数

import java.util.Scanner; //求两个数的最大公约数,最小共倍数. public class CommonMaxDivisor { public static void main(String[] args){ Scanner scanner=new Scanner(System.in); int m=scanner.nextInt(); int n=scanner.nextInt(); scanner.close(); CommonMaxDivisor cmd=new

【C语言】求多个数中的最大值(可变参数列表)

求多个数中的最大值要求用可变参数列表: 代码如下: <span style="font-size:18px;">#include<stdio.h> #include<stdarg.h> int Max(int n,...) { int i=0; int max=0; va_list arg; va_start(arg,n); for(i=0;i<n;i++) { int val=va_arg(arg,int); if (val>max)

算法 - 求n个数的中位数(C++)

placeholder算法 - 求n个数的中位数(C++),布布扣,bubuko.com

求两个数之间的随机正整数

求两个数之间的随机正整 数.并添到新数组,数组长度由自己指定.并且数组中不能有重复的值 function getRandomInt (min, max) { return Math.floor(Math.random() * (max - min + 1) + min) } function numInt(n, min, max) { const arr = [] while(arr.length < n) { let num = getRandomInt(min, max) if (arr.i