题目描述
这几天,小明学长事情比较多,一边写文件,一边思考怎么为小石坝们出既有意思,又能检验大家学习情况的题目。忙的一塌糊涂的小明学长看见石榴学弟竟然来找他闲聊!闲聊!!!聊着聊着石榴学弟随口一句:“等我看见好的题目也加上去”,“行啊” , “。。。”(都知道做题消耗脑细胞,其实出题消耗更多脑细胞,发际线又得高了,宝宝心里苦,不想说话),,于是,石榴理所当然的认为学弟替学长分担任务是一种应该传承的美德,那么就把这道困扰石榴好久的问题交给你们了:
给定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;
}