package sean.home.test;import java.io.*;public class ShowSequence {
public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.print("Please input an integer which is between 0 and 10: ");
try {
int i = Integer.parseInt(in.readLine());
showSequence(i);
break;
}
catch (IOException io) {
System.out.println("I/O Exception occurred. Program will exit.");
break;
}
catch (NumberFormatException nfe) {
System.out.println("NOTCIE: You need to input a number.");
}
catch (IllegalArgumentException iae) {
System.out.println("NOTICE: Your input is outside range(0, 10).");
}
}
} static void showSequence(int a) {
if (a<1||a>9) throw new IllegalArgumentException();
int[] res = new int[a];
for (int i = 0; i < a; i++) {
res[i] = i + 1;
}
showSeq("", res);
} static void showSeq(String prefix, int[] ia) {
String pref = prefix;
if (ia.length == 1) {
System.out.println(prefix+ia[0]);
return;
}
for (int i = 0; i < ia.length; i++) {
pref += ia[i];
int[] temp = removeElem(i, ia);
showSeq(pref, temp);
pref = prefix;
}
} static int[] removeElem(int at, int[] ia) {
int iaLength = ia.length;
if (iaLength == 1) return new int[0];
int[] res = new int[iaLength - 1];
for (int i = 0; i < at; i++) res[i] = ia[i];
for (int i = at + 1; i < iaLength; i++) res[i-1] = ia[i];
return res;
}}
public static void main(String[] args) {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.print("Please input an integer which is between 0 and 10: ");
try {
int i = Integer.parseInt(in.readLine());
showSequence(i);
break;
}
catch (IOException io) {
System.out.println("I/O Exception occurred. Program will exit.");
break;
}
catch (NumberFormatException nfe) {
System.out.println("NOTCIE: You need to input a number.");
}
catch (IllegalArgumentException iae) {
System.out.println("NOTICE: Your input is outside range(0, 10).");
}
}
} static void showSequence(int a) {
if (a<1||a>9) throw new IllegalArgumentException();
int[] res = new int[a];
for (int i = 0; i < a; i++) {
res[i] = i + 1;
}
showSeq("", res);
} static void showSeq(String prefix, int[] ia) {
String pref = prefix;
if (ia.length == 1) {
System.out.println(prefix+ia[0]);
return;
}
for (int i = 0; i < ia.length; i++) {
pref += ia[i];
int[] temp = removeElem(i, ia);
showSeq(pref, temp);
pref = prefix;
}
} static int[] removeElem(int at, int[] ia) {
int iaLength = ia.length;
if (iaLength == 1) return new int[0];
int[] res = new int[iaLength - 1];
for (int i = 0; i < at; i++) res[i] = ia[i];
for (int i = at + 1; i < iaLength; i++) res[i-1] = ia[i];
return res;
}}
static final long MAXVAL = 1000;
public static void main(String[] args) {
for (long l = 1; l < MAXVAL; l++) {
if (isPrime(l)) System.out.println(l);
}
}
static boolean isPrime(long n) {
if (n<=1) return false;
if (n==2) return true;
if (n%2==0) return false;
for (int i = 3; (i*i)<=n; i+=2) {
if (n%i==0) return false;
}
return true;
}
}
既然如此,也去
http://expert.csdn.net/Expert/topic/2885/2885176.xml?temp=4.108828E-02
看看吧,
//计算正整数n的全排列,并打印;比如 n=3 打印出结果为:
//1,2,3
//1,3,2
//2,1,3
//2,3,1
//3,1,2
//3,2,1import java.util.*;
public class AllOrder1 {
public static ArrayList getAllOrder(int n) {
ArrayList al = new ArrayList();
if(1==n) {
al.add(new String[]{Integer.toString(1)});
return al;
} else {
al = getAllOrder(n-1);
ArrayList result=new ArrayList();
for(int i=0;i<al.size();i++) {
String[] arr = (String[])al.get(i);
for(int j=0;j<=arr.length;j++) {
//put 'n' in the int[n-1].
result.add(insert((String[])al.get(i), j, Integer.toString(n)));
}
}
return result;
}
} public static String[] insert(String[] arr, int pos, String n) { //把n插入arr的所有空隙
String[] result=new String[arr.length+1];
for (int i=0;i<pos;i++) {
result[i]=arr[i];
}
result[pos]=n;
for (int j=pos+1;j<result.length;j++) {
result[j]=arr[j-1];
}
return result;
} public static void main(String[] args) {
int num=4;
ArrayList result = getAllOrder(num);
System.out.println("All result(" + result.size() + "组): ");
ArrayList all = new ArrayList();
for(int i=0;i<result.size();i++) {
String single = join((String[])result.get(i));
all.add(single);
} Object[] allStr = (Object[])(all.toArray());
Arrays.sort(allStr); for(int i=0;i<allStr.length;i++) {
System.out.println(split((String)allStr[i]));
} } public static String join(String[] arr) { //合并,用于排序:1,2,3->123
StringBuffer result=new StringBuffer("");
for(int i=0;i<arr.length;i++)
result.append(arr[i]);
return new String(result);
}
public static String split(String str) { //拆分:123->1,2,3
StringBuffer result=new StringBuffer("");
for(int i=0;i<str.length();i++) {
result.append(str.substring(i, i+1));
if(i!=str.length()-1)
result.append(", ");
}
return new String(result);
}
}
import java.util.*;public class Permutation {
public static void main(String[] args) {
int count =0;
Permutation p = new Permutation();
ArrayList sourceList = new ArrayList();
//初始化要排列组合的数列
for(int i=1; i<=2; i++) {
sourceList.add(new Integer(i));
}
sourceList.add(new Integer(2));
long t1 = System.currentTimeMillis();
//所有结果将存储在一个HashSet对象中
HashSet resultSet = p.permute(sourceList);
long t2 = System.currentTimeMillis();
Iterator rit = resultSet.iterator();
while(rit.hasNext()) {
System.out.println((ArrayList)rit.next());
count++;
}
System.out.println(count);
long t3 = System.currentTimeMillis();
System.out.println("Permutation Time: " +(t2-t1));
System.out.println("Total Time: " +(t3-t1));
} /*执行排列组合的具体方法:递归。若原数组只有一个元素,则结果只有一个——它自己
把它加到set中即可;若原数组多于一个元素,则结果是从中取出一个元素,然后将剩下
的元素排列组合,先前取出的元素加到每一个排列组合中即可*/
public HashSet permute(ArrayList list) {
HashSet set = new HashSet();
if(list.size()==1) {
set.add(list);
}
else if(list.size()>1) {
for(int i=0; i<list.size(); i++) {
Integer integer = (Integer)list.get(i);
//克隆一个副本进行后续操作,以免原数组改变而影响下次循环。
ArrayList cList = (ArrayList)list.clone();
//将剩下的元素排列组合
cList.remove(i);
HashSet tempSet = permute(cList);
Iterator it = tempSet.iterator();
//把取出的元素与剩下元素的每一个排列组合相加
while(it.hasNext()) {
ArrayList tempList=(ArrayList)it.next();
tempList.add(0,integer);
set.add(tempList);
}
}
}
return set;
}
}Java中没有局部对象的概念(只有局部引用),对象可以认为总是全局的,只要当没有任何引用再指向它时,JVM才会回收它。但本程序中必须要得到局部的对象才能使递归和循环不受影响,所以用clone()来实现。
因为排列组合不会涉及到数组内数值的改变,只是顺序改变罢了,所以浅层克隆就可以满足需求。