日期:2014-05-20  浏览次数:20804 次

哪位高手帮我用JAVA写几行代码啊?急求?
请你用Java解决下面的问题:

      1)   对于输入的任意自然数n,作排列组合显示
      如输入3,则应打印出
      1-> 2-> 3
      1-> 3-> 2
      2-> 1-> 3
      2-> 3-> 1
      3-> 1-> 2
      3-> 2-> 1

哪位大哥大姐帮帮小弟呀,实在是写不出来代码啊?



------解决方案--------------------

網上找的:

import java.math.*;

public class nest
{

private int[] a;

private BigInteger numLeft;

private BigInteger total;

// -----------------------

// Constructor. WARNING: Don 't make n too large.

// Recall that the number of permutations is n!

// which can be very large, even when n is as small as 20 --

// 20! = 2,432,902,008,176,640,000 and

// 21! is too big to fit into a Java long, which is

// why we use BigInteger instead.

// ----------------------

public nest(int n)
{
if (n < 1)
{
throw new IllegalArgumentException( "Min 1 ");
}
a = new int[n];
total = getFactorial(n);
reset();
}

// ------
// Reset
// ------
public void reset()
{
for (int i = 0; i < a.length; i++)
{
a[i] = i;
}
numLeft = new BigInteger(total.toString());
}

// ------------------------------------------------
// Return number of permutations not yet generated
// ------------------------------------------------
public BigInteger getNumLeft()
{
return numLeft;
}

// ------------------------------------
// Return total number of permutations
// ------------------------------------
public BigInteger getTotal()
{
return total;
}

// -----------------------------
// Are there more permutations?
// -----------------------------
public boolean hasMore()
{
return numLeft.compareTo(BigInteger.ZERO) == 1;
}

// ------------------
// Compute factorial
// ------------------
private static BigInteger getFactorial(int n)
{
BigInteger fact = BigInteger.ONE;
for (int i = n; i > 1; i--)
{
fact = fact.multiply(new BigInteger(Integer.toString(i)));
}
return fact;
}

// --------------------
// Generate next permutation (algorithm from Rosen p. 284)
// --------------------
public int[] getNext()
{
if (numLeft.equals(total))
{
numLeft = numLeft.subtract(BigInteger.ONE);
return a;
}
int temp;
// Find largest index j with a[j] < a[j+1]
int j = a.length - 2;
while (a[j] > a[j + 1])
{
j--;
}

// Find index k such that a[k] is smallest integer
// greater than a[j] to the right of a[j]
int k = a.length - 1;
while (a[j] > a[k])
{
k--;
}
// Interchange a[j] and a[k]
temp = a[k];
a[k] = a[j];
a[j] = temp;
// Put tail end of permutation after jth position in increasing order
int r = a.length - 1;
int s = j + 1;
while (r > s)
{
temp = a[s];
a[s] = a[r];
a[r] = temp;
r--;