首页
社区
课程
招聘
[旧帖] [求助]生成所有五位的整数 求算法 0.00雪花
发表于: 2010-12-7 11:45 1424

[旧帖] [求助]生成所有五位的整数 求算法 0.00雪花

2010-12-7 11:45
1424
生成所有五位的整数

问了好多人没一个人做出来  求算法

不是 我没有说清楚

是随意给你五个数 ,让你生成所有的可能组成的数


补充一下:
给出的数范围0到9   给出的五个数 可以有重复的
给出的五个数必须都用上
如果五个数互不相同 不可以把一个数在一个五位数中重复用
比如 1 2 3 4 5 不可以组成12234
但是 1 2 3 3 4 其中 3可以用两次
细想想好复杂啊 脑袋要爆炸啦

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (23)
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
for(int i = 10000; i <= 99999; ++i) {
    printf("%d\n", i);
}
2010-12-7 12:19
0
雪    币: 780
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=Analytics;899707]
for(int i = 10000; i <= 99999; ++i) {
    printf("%d\n", i);
}
[/QUOTE]

哈哈,跟我想的一样
2010-12-7 12:22
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不是 我没有说清楚

是随意给你五个数 ,让你生成所有的可能组成的数
2010-12-7 12:29
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
5
嵌套循环。穷举
2010-12-7 12:30
0
雪    币: 343
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
kankanaknakana
2010-12-7 12:32
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
5!   字数不够+++
2010-12-7 13:20
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
5楼的 说的简单 动手做做试试啊
2010-12-7 13:45
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
1.给的这五个数 是不是 都是 0~9 之间的?
2.当结果 中 有重复的数时 是都输出 还是 过滤掉 重复的数?
2010-12-7 13:53
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼上的

给出的数范围0到9

给出的数在一个五位数中只能用一次

比如 1 2 3 4 5 不可以组成12234

但是 1 2 3 3 4 其中 3可以用两次

唉 细想想好复杂啊 脑袋要爆炸啦
2010-12-7 14:20
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
#include "stdio.h"
void main()
{
	int	a[5]={0},i,j,k,m,n;
	for(i=0;i<5;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]>9||a[i]<0)
		{
			printf("Wrong number %d,Input again\n",a[i]);
			--i;
		}
	}
	int sum=0;

	for(i=0;i<5;i++)
		for(j=0;j<5;j++)
		{
			if(j==i) continue;
			for(k=0;k<5;k++)
			{
				if(k==j||k==i) continue;
				for(m=0;m<5;m++)
				{
					if(m==k||m==j||m==i) continue;
					for(n=0;n<5;n++)
					{
						if(n==m||n==k||n==j||n==i) continue;
						printf("%d\n",a[i]+10*a[j]+100*a[k]+1000*a[m]+10000*a[n]);
						sum++;
					}
				}
			}
		}


	printf("\nSUM==%d\n(不负责处理结果中重复的数)\n",sum);

}
2010-12-7 14:27
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
#include "stdio.h"

int main()
{
        char str[20];
               
        while (scanf("%s", str) != EOF)
        {
                for (int i=0; i<5; i++)
                {
                        char buf[20] = {0};

                        buf[0] = str[i];
                       
                        for (int j=0; j<5; j++)
                        {
                                buf[1] = str[j];
                               
                                if (buf[0] != buf[1])
                                {
                                        for (int m=0; m<5; m++)
                                        {
                                                buf[2] = str[m];
                                               
                                                if (buf[2] != buf[1] && buf[2] != buf[0])
                                                {
                                                        for (int n=0; n<5; n++)
                                                        {
                                                                buf[3] = str[n];

                                                                if (buf[3] != buf[2] && buf[3] != buf[1] && buf[3] != buf[0])
                                                                {
                                                                        for (int x=0; x<5; x++)
                                                                        {
                                                                                buf[4] = str[x];

                                                                                if (buf[4] != buf[3] && buf[4] != buf[2]
                                                                                        && buf[4] != buf[1] && buf[4] != buf[0])
                                                                                {
                                                                                        printf("%s\n", buf);
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
               
        return 0;
}

来这个满足你要求,哈哈!!穷举
2010-12-7 14:35
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
估计楼主要求是

5位数=rand(5)

if (5位数==全不同)
组合=5!
elseif(5位数==某2位相同  and 5位数==某3位不同)
组合=5!/2!
elseif(5位数==某2位相同  and 5位数==另数某2位不同)
组合=5!/(2!*2)
elseif(5位数==某2位相同  and 5位数==某3位相同)
组合=5!/(2!*3!)
elseif..........把情况都写上..
2010-12-7 15:12
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
12楼的算法好怪 输入的怎么是一个字符串

13楼的做法太复杂了吧 穷举要多少个if else 呢
2010-12-7 15:27
0
雪    币: 247
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
输入字符串 输入整数都可以啊 你愿意的话也可以输入整数 然后出来再变换一样的 呵呵!
我只是把输入的数据用字符串来处理 比如 12345 就是字符串12345  str[0] = '1' str[1] = '2' 以此类推 然后穷举所有不重复的组合!
这个方法比较暴力 把事情都丢给电脑做了,不适合大量数据,但是如果只是5个的话 那还是可以的
2010-12-7 15:46
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
你都说了随机了。。。。。。
既然是随机,连计算机都预先不可知出现的数的是否不同,重负,还是多重重负(两个数都是出现2次)
x,x,x,x,x肯定要把所以出现的情况考虑进去
否则要真想不到如何能快速处理,未知数的组合........
2010-12-7 16:22
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我想到的就是动态规划,加上递归,还要排除0开头的情况
2010-12-7 18:15
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
好像LZ的意思不用排除0吧,不是组成数值,而是序列吧  类似0,1,2,3,4 应该是符合规则的吧....
2010-12-7 18:40
0
雪    币: 401
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
5L说的是对的,而代码正如11L发的那样,12L理解错了题意。

估计lz之所以没做出来是没想到用continue。
2010-12-8 13:16
0
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
20
这题只是费脑胞,对于智力开发没有意义!
你整过排列组合这就是基础题.
2010-12-12 20:13
0
雪    币: 288
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这个。。。还可以重复?不就是做五个数字的全排列嘛!总共5!=120个结果。
你给的题目没有条件限制,无需任何技术和技巧,要使该题有难度可以这样:任意给出5个数字,用这五个数字组成所有可能组成的数。满足:(1)生成的数不重复(如:给出的数字中有两个重复数码,不做处理生成的数字中相同的那两个数码交换位置,所得到的数是一样的。)(2)首位不能为零。当然这只是一个特例了,普遍情况应该把5变成n。
2010-12-12 20:48
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
这个应该要考虑一下几个问题:
①在给出的数种是否有 ’ 0 ‘ 这个元素 , 如果是零的 你仍然要做全排列的话,就只能非零数在第一位;你这个零的个数问题,看到你的描述中,在输入元素中的元素是可以相同的,因此,我这里问一句:0 这个数是否也可以重复?
②穷举的问题。当五个元素互不相等且没有一个为0的时候,那么穷举是可以的。当元素存在相等的时候,就要考虑元素相等的问题。我在这里假设元素的个数为N(1<=n<=5),不注意这N个元素的排序,那么就有以下组合。1:1:1:1:1 、1:1:1:2、1:1:3、1:4、5、2:3,对应的所有可能的组合的个数是5!,5!/2!, 5!/3!,5!/4!,5!/5!,5!/2!/3! 这么个情况。这些情况中需要考虑到是否有 0 这个数 如果有 肯定比上面的还要少。
③建议你去看看高中的排列组合问题,那个至少说明了一种方法----穷举!

希望对你有帮助。我是编程菜鸟!!
2010-12-12 20:59
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
全排列?
void swap(char *x,char *y)
{
        char tmp=*x;
        *x=*y;
        *y=tmp;
}
void Ana(char *s ,int j,int k)
{
   
        if(j!=k)
    {
                for(int i=j;i<=k;i++)
                {
                       
                        swap(&s[j],&s[i]);
                        if(j!=i || j==0)
                        printf("%s\n",s);
               
                       
                        Ana(s,j+1,k);
                swap(&s[j],&s[i]);
                }
        }
}

int main(int argc, char* argv[])
{
        char test[]="12345";
        Ana(test,0,4);
                 
        return 0;
}
2010-12-12 21:02
0
雪    币: 32
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
int a[5];
....
sort(a, a + 5);
do {
	int t = 0;
	for(int i = 0; i < 5; ++i) {
		t = t * 10 + a[i];
	}
    if(t >= 10000) printf("%d\n", t);
} while(next_permutation(a, a + 5));
2010-12-14 09:41
0
游客
登录 | 注册 方可回帖
返回
//