C++ 产生所有每个数字不同的五位数

Betabetter 2014-05-01 09:13:50
#include<iostream>
using namespace std;
main()
{
int i,j,k;
int flag=1;//置标变量
int xx[6];//用于存储五个数值

for(i=10000;i<100000;i++)//所有五位数
{
for(j=0;j<5;j++)//将五位数的每个数分离出来并存储在xx数组中
{
xx[j]=i%10;
i=i/10;
}
for(j=0;j<4;j++)//检测五个数是否对彼此不相等
{ for(k=j+1;k<5;k++)
{
if(xx[j]==xx[k])
flag=0;
}
}
j=4;
while((flag==1)&&(j>=0))//若五个数互相不相等,则输出这个五位数
{
cout<<xx[j];
j--;
}
}
}
...全文
590 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gz_qmc 2014-05-02
  • 打赏
  • 举报
回复
啥也不说,直接上代码
int main()
{

	int  i,j,k,m,n;
	char buf[6]={0};
	int  x=0;
	for(i=1;i<=9;i++)
	{
		buf[0]=i+0x30;
		for(j=0;j<=9;j++)
		{
			if(j==i) continue;
			buf[1]=j+0x30;
			for(k=0;k<=9;k++)
			{
				if(k==j||k==i) continue;
				buf[2]=k+0x30;
				for(m=0;m<=9;m++)
				{
					if(m==k||m==j||m==i) continue;
					buf[3]=m+0x30;
					for(n=0;n<=9;n++)
					{
						if(n==m||n==k||n==j||n==i) continue;
						buf[4]=n+0x30;
						sscanf(buf,"%d",&x);
						printf("%d   ",x);
					}
				}
			}
		}
	}
	return 0;
}
xiaocha 2014-05-02
  • 打赏
  • 举报
回复
C++库里有全排列函数,直接调用即可,函数名不记得了,自己搜一下
xiaocha 2014-05-02
  • 打赏
  • 举报
回复
感觉好的算法是: 1: 从0-9选N个不同数字 2:对于1产生的N个数据全排列 产生全排列的算法可以搜索一下
gz_qmc 2014-05-02
  • 打赏
  • 举报
回复
5位数,不算太暴 9x9x9x9x9=59049 比楼主的 100000-10000=90000 还要少30951次呢
显圣真君 2014-05-02
  • 打赏
  • 举报
回复

楼上暴力了
buyong 2014-05-02
  • 打赏
  • 举报
回复
引用 8 楼 u012848622 的回复:
[quote=引用 2 楼 xiaocha 的回复:] 感觉好的算法是: 1: 从0-9选N个不同数字 2:对于1产生的N个数据全排列 产生全排列的算法可以搜索一下
说得容易!!!!!! [/quote] http://www.cnblogs.com/caixu/archive/2011/10/31/2229862.html
Betabetter 2014-05-02
  • 打赏
  • 举报
回复
引用 2 楼 xiaocha 的回复:
感觉好的算法是: 1: 从0-9选N个不同数字 2:对于1产生的N个数据全排列 产生全排列的算法可以搜索一下
说得容易!!!!!!
Betabetter 2014-05-02
  • 打赏
  • 举报
回复
引用 6 楼 gz_qmc 的回复:
5位数,不算太暴 9x9x9x9x9=59049 比楼主的 100000-10000=90000 还要少30951次呢
你那种算法是:9x10x10x10x10=90000.好不好。
highnewrain 2014-05-01
  • 打赏
  • 举报
回复

#include<iostream>
#include <set>
using namespace std;

int g_iCount=0;			   //记录数据总个数
const int g_iPlaceNum=5;   //控制数据位数

void CalDiffNum(int iNum[g_iPlaceNum] ,int iIndex)
{
	if(iIndex==g_iPlaceNum-1)
	{
		int iTemp=0;
		for(int i=0;i<g_iPlaceNum;++i)
		{
			iTemp=iTemp+iNum[i]*(int)pow((double)10,(double)(g_iPlaceNum-1-i));
		}
		++g_iCount;
		cout<<"第"<<g_iCount<<"个数:"<<iTemp<<endl;
	}
	else
	{
		++iIndex;
		set<int> excl;
		excl.insert(iNum,iNum+iIndex);		//建立排除集
		for(int i=0;i<10;++i)
		{
			if(!excl.count(i))
			{
				iNum[iIndex]=i;
				CalDiffNum(iNum,iIndex);	//递归调用
			}
		}
		excl.clear();
	}
}

void main()
{
	int iNum[g_iPlaceNum]={0};	//保存每位的数据,iNum[0]表示最高位
	for(int i=1;i<10;++i)		//从最高为开始计算,最高位只能取1~9之间的数
	{
		memset(&iNum,0,sizeof(int)*g_iPlaceNum);
		iNum[0]=i;
		CalDiffNum(iNum,0);
	}
}


这里用到了递归和标准库的set容器,通过修改g_iPlaceNum的值,可以控制不同数字的位数 算法学的不好,效率估计不高,好歹可以正常跑起来,仅供参考,如有不当之处,请多指教

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧