/*
题目标题: 1、2、3、4、5形成的全排列
12345形成的全排列组成的肯定是一个5位数
所以对5位整数逐一判断是否是全排列中的一个,如果这5位数中没有0、6、7、8、9这几个数,且这5个数中没有重复元素
*/
#include<iostream>
#include<cstring>
using namespace std;
/*
bool checkNum(int n) //判断整数n中是否有重复数字---方法1
{
int num[11],i,j,p=n,count=0; //用数组元素num[0]~num[9] 存放n分解得到的高到低位上的数字
i=1;
while(p) //将要判断的数依次分解别放到数组num中num[1]~num[10]分别存放高到低位上的数字
{
num[i++]=p%10;
p/=10;
}
count=i-1; //count用来记录要判断的整数个数
for(i=1;i<=count-1;i++) //用双循环判断分解得到的各个位上的数字是否相等,如果相等,函数返回false
for(j=i+1;j<=count;++j)
if(num[i]==num[j]) //判断是否是重复数字
return false;
return true;
}
*/
bool checkNum(int n) //判断整数n中是否有重复数字,方法2
{
int arr[]={0,1,2,3,4,5,6,7,8,9}; //数组下标整数值对应对应的整数
do{
if(arr[n%10]>=0&&arr[n%10]<=9) //此位上的数是0~9的数,且从未出现过
{
arr[n%10]=-1; //标记对应数字为已出现过,将数组元素值改为-1
}else{ //第二次出现了
return false;
}
n/=10; //从个位开始循环判断各个位上数字
}while(n!=0);
return true;
}
bool hasdigit(int n,int digit) //判断整数n中有没有某个数字,有返回true,没有返回false
{
do{
if(n%10==digit)
return true;
n=n/10;
}while(n!=0);
return false;
}
bool noalldigit(int n,int digitArr[],int arraysize) //判断整数n中有没有某个数组中给出的数字,没有返回true,有返回false
{
int i;
for(i=0;i<arraysize;i++) //遍历数组中的每一个数字进行存在判断
{
if(hasdigit(n,digitArr[i])) //调用hasdigit函数判断某一个数字是否存在
return false;
}
return true;
}
int main()
{
int n; //n表示一个5位数
int count=0;
int nonumber[]={0,6,7,8,9};
for(n=12345;n<=54321;n++)
{
//如果此5位数中不存在0,6,7,8,9,并且没有重复数字,表示是12345的一个全排列
if( noalldigit(n,nonumber,sizeof(nonumber)/sizeof(int))&&checkNum(n))
{cout<<n<<endl;
count++;
}
}
cout<<"count="<<count<<endl;
return 0;
}