1. 程式人生 > >小明學長給學弟的任務

小明學長給學弟的任務

題目描述

 這幾天,小明學長事情比較多,一邊寫檔案,一邊思考怎麼為小石壩們出既有意思,又能檢驗大家學習情況的題目。忙的一塌糊塗的小明學長看見石榴學弟竟然來找他閒聊!閒聊!!!聊著聊著石榴學弟隨口一句:“等我看見好的題目也加上去”,“行啊”  , “。。。”(都知道做題消耗腦細胞,其實出題消耗更多腦細胞,髮際線又得高了,寶寶心裡苦,不想說話),,於是,石榴理所當然的認為學弟替學長分擔任務是一種應該傳承的美德,那麼就把這道困擾石榴好久的問題交給你們了:
給定0~9的數字,求出能組成的所有各位不重複的三位數。

 

輸入

多組測試資料,當n為0時輸入結束且不做輸出。
對於每組測試樣例:第一行一個數字n(3<= n <= 10)
第二行給出 n個0~9的整數,且按照從小到大不重複的給出,用空格隔開。
 

 

輸出

對於每組輸入,按照從小到大輸出,輸出能組成的所有各位不重複的三位整數,一個整數佔一行。

 

樣例輸入

3
1 2 3
3
4 6 8
0

 

樣例輸出

123
132
213
231
312
321
468
486
648
684
846
864

解題思路:

1:判斷n>0是否成立,否結束,是,往下

2:輸入 n個0~9的整數,且按照從小到大不重複的給出,用空格隔開。

3:將這n 個數組成各位不重複的三位整數,共6*C(n,3)個//C()表示組合

4:按從小到大輸出

 

#include<iostream>
#include<algorithm>
#define num 10010
using namespace std;
long long C(int n,int m)               //組合 
{
	long long t=1;
	m=(n-m)>m?(n-m):m;
    for(int i=m+1;i<=n;i++)
    t*=i;
    for(int i=1;i<=n-m;i++)
    t/=i;
    return t;   	
} 
int main()
{
	int n;
	while(1)
	{
	  cin>>n;
	  if(n>0)
	  {
	  		int a[11];
		int b[num];
		int l=0,t;
		for(int i=0;i<n;i++)
		cin>>a[i];
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			for(int k=0;k<n;k++)
			if(a[i]!=a[j]&&a[i]!=a[k]&&a[j]!=a[k])
			{
			b[l]=100*a[i]+10*a[j]+a[k];
			l++;	
		    }
		}
		t=6*C(n,3);
		sort(b,b+t);
		for(int i=0;i<t;i++)
		{
			if(b[i]>100)
		    cout<<b[i]<<endl;
		}
      }
	  else
	  break;	 
	}	
return 0;	
}