编写一个Java程序 用1、2、3、4这四个数组成一个四位数,要求每位不能重复,输出其所有组合

如题所述

方法1:

public class PaiLie {// 对一组数字进行全排列
public static void main(String[] args) {
int a[] = new int[5];
for (int i = 1; i < a.length; i++)
a[i] = i;
pailie(a, 1);
}
public static void pailie(int[] a, int n) {// n 待交换数的索引
if (n < a.length - 1) {
for (int i = n; i < a.length; i++) {
int temp = a[i];
for (int k = i; k > n; k--)
a[k] = a[k - 1];
a[n] = temp; // 把该段最右面的数移到最左面
pailie(a, n + 1);
// 还原原来序列
for (int k = n; k < i; k++)
a[k] = a[k + 1];
a[i] = temp;
}
} else {
for (int j = 1; j < a.length; j++)
System.out.print(a[j] + " ");
System.out.println();
}
}
}

方法2:

public class PaiLie_2 {
public static void main(String[] args) {
final int N = 4;
int a[] = new int[N + 1];
for (int i = 1; i < a.length; i++)
a[i] = i;
pailie(a, 1, N);
} // 产生a[m:n]的所有排列
public static void pailie(int[] a, int m, int n) {
if (m == n) {
for (int j = 1; j <= n; j++)
System.out.print(a[j] + " ");
System.out.println();
} else
for (int i = m; i <= n; i++) {
swap(a, m, i);
pailie(a, m + 1, n);
swap(a, m, i);
}
}
// 交换数组中两个位置上的元素
public static void swap(int[] number, int i, int j) {
int t;
t = number[i];
number[i] = number[j];
number[j] = t;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-18
楼上的代码都蛮好的,思路是这样的,用嵌套的for循环去实现(这样就不会重复),4个for循环表示四位数。他们是一一对应的,简单说吧:比如用两个for循环:
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
if(i!=j)·····
}
}
这样的思路你应该懂的···
第2个回答  2012-07-18
public class Practist {
/**
* 本法是输入1,2,3,4不重复的4位数
* 一个循环是代表一个位数,在最后一层中做个判断并输出,就可以显示了。
*/
public void printf(){
for(int i=1;i<5;i++){
for(int j=1;j<5;j++){
for(int m=1;m<5;m++){
for(int n=1;n<5;n++){
if(i!=j && i!=m && i!=n && j!=m && j!=n && m!=n)
System.out.printf("%d%d%d%d\n",i,j,m,n);
}
}
}
}
System.out.println();
}

public static void main(String[]args){
Practist test = new Practist();
test.printf();
}
}本回答被网友采纳
第3个回答  2012-07-18
//用了递归深度搜索,顺便学习下

public class ForYou {
static final int[] DIGIT = {1,2,3,4};
static int count = 0;//记录符合要求的组合数
public static void main(String[] args) {
int[] num = new int[4];
search(num, 0);
}
//使用递归搜索
private static void search(int[] num, int n) {
if(n == 4)
{
print(num);//打印
return;
}
for(int i = 0 ; i < DIGIT.length; i++)
{
int j;
for(j = 0 ; j < n; j++)//判断是否重复
{
if(DIGIT[i] == num[j])
break;
}
if(j < n)
continue;
//不重复则继续
num[n] = DIGIT[i];
search(num, n + 1);
}
}
//打印符合要求的组合
private static void print(int[] num) {
System.out.print(++count + " : ");
for(int i = 0 ; i < num.length; i++)
System.out.print(num[i] + ", ");
System.out.println();
}
}
第4个回答  2012-07-18
int n;
int count=0;
Vector<Integer> v = new Vector<Integer>();
for(int i=1;i<=4;i++)
{
for(int j=1;j<=4;j++)
{
if(i!=j)
{
for(int l=1;l<=4;l++)
{
if(i!=l&&j!=l)
for(int k=1;k<=4;k++)
{
if(i!=k&&j!=k&&l!=k)
{
n=i*1000+j*100+l*10+k;
v.add(n);
count++;
}
}
}
}
}
}
System.out.println(count);
System.out.println(v);

修改好了 没有问题
相似回答