打印1到99999999,不重复的数字!

xk82180316 2010-08-10 07:41:26
打印1到999999999,不重复的数字!

比如 1 可以 11 就不行

123 可以 223 就不行

就是说这个数字里面的数,不能有重复的数字.

看看谁的算法效率高~
...全文
382 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xk82180316 2010-08-11
  • 打赏
  • 举报
回复
其实共有:362880排列。

楼上的你计算错了~
lsdsjy 2010-08-11
  • 打赏
  • 举报
回复
学习了
zhujian888 2010-08-11
  • 打赏
  • 举报
回复
修改了下。


namespace myTestDemo
{

class Program
{
private static int[] arrOrg = { 1, 2, 3, 4, 5, 6, 7 , 8, 9 }; //原始组合数据

private static int[] arrUse = { 0, 0, 0, 0 ,0 , 0 , 0, 0, 0 };//标识数组

private static int[] arrResult = { 0, 0, 0, 0 ,0 , 0, 0 ,0 , 0};//结果数组

private static int inc = 0;

private static ArrayList list = new ArrayList();

static int nCurrentBit = 0;

static void recursion(int[] arr, int pos) //处理组合
{
if (pos == nCurrentBit)
{
// int sum = FunHash();
// if (list.Contains(sum))
// {
//// return;
// }
//list.Add(sum);
print();
inc++;
return;
}

if (pos < arr.Length)
{

for (int i = 0; i < arr.Length; i++)
{
if (arrUse[i] == 0)
{
arrUse[i]++;
arr[pos] = arrOrg[i];
recursion(arr, pos + 1);
arrUse[i]--;
}

}

}
}

//private static int FunHash()
//{
// int sum = 0;
// int[] arrSave = new int[nCurrentBit];
// Array.Copy(arrResult, arrSave, nCurrentBit);
// Array.Sort(arrSave, 0, nCurrentBit);
// for (int i = 0; i < nCurrentBit; i++)
// {

// sum = sum << 3;
// sum |= arrSave[i];
// }
// return sum;
//}

private static void print()
{
for (int i = 0; i < nCurrentBit; i++)
{
Console.Write(arrResult[i] + "\t");
}
Console.WriteLine();
}

static void Main(string[] args)
{
for (int i = 1; i <= 9;i++ )
{
nCurrentBit = i;
Array.Clear(arrUse, 0, arrUse.Length);
Array.Clear(arrResult, 0, arrResult.Length);
recursion(arrResult, 0);
}
Console.WriteLine("共 {0} 种", inc);
}
}
}




共 986409 种
zhujian888 2010-08-11
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace myTestDemo
{

class Program
{
private static int[] arrOrg = { 1, 2, 3, 4, 5, 6, 7 , 8, 9 }; //原始组合数据

private static int[] arrUse = { 0, 0, 0, 0 ,0 , 0 , 0, 0, 0 };//标识数组

private static int[] arrResult = { 0, 0, 0, 0 ,0 , 0, 0 ,0 , 0};//结果数组

private static int inc = 0;

private static ArrayList list = new ArrayList();

static int nCurrentBit = 0;

static void recursion(int[] arr, int pos) //处理组合
{
if (pos == nCurrentBit)
{
int sum = FunHash();
if (list.Contains(sum))
{
return;
}
list.Add(sum);
print();
inc++;
return;
}

if (pos < arr.Length)
{

for (int i = 0; i < arr.Length; i++)
{
if (arrUse[i] == 0)
{
arrUse[i]++;
arr[pos] = arrOrg[i];
recursion(arr, pos + 1);
arrUse[i]--;
}

}

}
}

private static int FunHash()
{
int sum = 0;
int[] arrSave = new int[nCurrentBit];
Array.Copy(arrResult, arrSave, nCurrentBit);
Array.Sort(arrSave, 0, nCurrentBit);
for (int i = 0; i < nCurrentBit; i++)
{

sum = sum << 3;
sum |= arrSave[i];
}
return sum;
}

private static void print()
{
for (int i = 0; i < nCurrentBit; i++)
{
Console.Write(arrResult[i] + "\t");
}
Console.WriteLine();
}

static void Main(string[] args)
{
for (int i = 1; i <= 9;i++ )
{
nCurrentBit = i;
recursion(arrResult, 0);
}
Console.WriteLine("共 {0} 种", inc);
}
}
}



献丑了。
按照题目的意思,共382种可能。不知道是否正确,可能我粗心大意弄错也说不定。
yzx714 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 xk82180316 的回复:]

yzx714 你的代码有问题,最好 999999999 测试下有多少个!

658
659
………… 601,602,603 这些全部漏掉了
670
671
[/Quote]没搞错吧,601,602,603 这些都打印了
xk82180316 2010-08-11
  • 打赏
  • 举报
回复
yzx714 你的代码有问题,最好 999999999 测试下有多少个!

658
659
………… 601,602,603 这些全部漏掉了
670
671
yzx714 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 yzx714 的回复:]

C/C++ code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define START_NUM 1
#define FINISH_NUM 999
#define MAX_LENGTH_NUM 3

int is_duplicate(char* num);

int main(void)
{
char str_n……
[/Quote]
is_duplicate函数中的printf("%d\n",num_map[(*num) - '0']);这个语句是我测试时写的,忘了注释掉了
yzx714 2010-08-11
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define START_NUM 1
#define FINISH_NUM 999
#define MAX_LENGTH_NUM 3

int is_duplicate(char* num);

int main(void)
{
char str_num[MAX_LENGTH_NUM+1];
int i;
for(i=START_NUM;i<=FINISH_NUM;++i){
sprintf(str_num,"%d\0",i);
if(is_duplicate(str_num))
printf("%s\n",str_num);
}
return 0;
}

/* 包含重复数字返回0,否则返回1 */
int is_duplicate(char* num)
{
int num_map[10];
bzero(num_map,sizeof(num_map));
while(*num != '\0'){
printf("%d\n",num_map[(*num) - '0']);
num_map[(*num) - '0']++;
if(num_map[(*num) - '0']>1)return 0;
num++;
}
return 1;
}

估计效率一般~
fancyivan 2010-08-11
  • 打赏
  • 举报
回复
有意思,占个位置,开IDE,码一码试试。
sacciness 2010-08-10
  • 打赏
  • 举报
回复
好像不对... 是全排列问题...
sacciness 2010-08-10
  • 打赏
  • 举报
回复
受4楼启发,想起这是八皇后问题的变体,可以用回溯法
ToBeOOP 2010-08-10
  • 打赏
  • 举报
回复
我想请教下四楼的代码
for (int a=i; a < N; ++a)
{
swap(&s[i], &s[a]);
fun(i+1); //进入递归以后还可以进入下面那条代码吗?
swap(&s[i], &s[a]);

}
yc710666178 2010-08-10
  • 打赏
  • 举报
回复
有点意思,想哈
redleaves 2010-08-10
  • 打赏
  • 举报
回复
固定长度且满足条件的所有数字,可以构成一个树.不同深度的节点对应着数字的不同位数.所有的节点都满足不和其任意层的父节点相同这个条件.
比如三层的树:
root
0 1 2 ... 9
1~9 0, 2~9 0,1,3~9 ... 0~8
(注意,对于0要特殊处理一下.)
然后遍历这个树,就是所有满足条件的数字.在具体实现的时候,这个树是不用构造出来的.用递归算法可以很容易的写出实现代码.
xk82180316 2010-08-10
  • 打赏
  • 举报
回复
嘿嘿 我自己做出来了~~~


#include <iostream>

using namespace std;

const int N = 9;
int s[]={1, 2, 3, 4, 5, 6, 7, 8, 9};


void p(void);
void fun(int i);
void swap(int *a, int *b);

int main(int argc, char *argv[])
{
fun(0);
return 0;
}

void p(void)
{
for (int i=0; i < N; ++i)
{
cout << s[i] << " ";
}

cout << endl;
}

void fun(int i)
{
if (i == N)
{
p();
return;
}

for (int a=i; a < N; ++a)
{
swap(&s[i], &s[a]);
fun(i+1);
swap(&s[i], &s[a]);

}


}

void swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}

九度空间 2010-08-10
  • 打赏
  • 举报
回复
太复杂了
ayw215 2010-08-10
  • 打赏
  • 举报
回复
从0,1,2,3,4,5,6,7,8,9里面选择n个数进行全排列,
然后判断组合是否合法,是否小于999999999
senlinzhiwang 2010-08-10
  • 打赏
  • 举报
回复
也就是说一个数里面不能同时出现两个相同的数字了。有意思,正在想。

64,646

社区成员

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

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