參考:http://blog.csdn.net/hyq666888/article/details/22572695
/**
* 给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数,输出所有可能的组合
* 要求不重不漏
*
* 思路:
* 假如說n=9 k=5的話。
* 那最後一個輸出的數字肯定是 5 6 7 8 9
* 而且每一輪輸出的最終數字都在 5 6 7 8 9 中
* 例如第一輪輸出的 12345-12349 中的9 就在 5 6 7 8 9 中。
*
* 所以我們可以每次輸出后,用當前輸出的數字去與 56789中對應的位置去比較,如果相等的話,就說明此輪輸出完畢
* 然後就倒退一位繼續比較。倒退后,如果加1 的話,那後面的幾位也要對應的發生改變 如 12789-》13456 其中 456 3個位置就發生了改變
*
* 最後如果第一位等於n-k+1的話,輸出就結束了。
*
* 參考:http://blog.csdn.net/hyq666888/article/details/22572695
* */
private static void fun1(int n, int k) {
int arr[]=new int[k];
int index[]=new int[k];
for(int i=0;i<k;i++){
arr[i]=i+1;
index[i]=n-k+i+1;
}
while(true){
for(int i=0;i<k;i++)
System.out.print(arr[i]);
System.out.println();
//循环终止条件
if(arr[0]==index[0])
break;
//输出一次后,对数组调整
for(int i=k-1;i>=0;i--){
if(arr[i]<index[i]){//末尾位不够最终数,加 1 。 false代表。第k位数够了,然后加第k-1位数
arr[i]++;
//假如是在增加第s位数(s最小可为1)时,第s到k位数要发生变化
for(int j=i+1;j<k;j++)
arr[j]=arr[j-1]+1;
break;//此次增加結束后就退出循環去輸出結果
}
}
}
}