1,2,3,4,5全排列--使用循环(一层循环)

 

/*
题目标题: 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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值