随即产生一个10位数,并且用到0--9不重复
随即产生一个10位数,并且用到0--9不重复,就是说0--9每次都全部用到?如何写,请路过的高手出手相助? 搜索更多相关的解决方案:
位数
----------------解决方案--------------------------------------------------------
#include <stdlib.h>
/*产生由0到9组成的数字串*/
void main()
{
int i,j;
int a[10]={-1};
/*首数字不能为0*/
a[0]=rand()%9+1;
i=1;
while(i<10)
{
a[i]=rand()%10;
j=0;
/*后面的数字不能和前面的数字相同*/
while(j<i)
{
if(a[i]==a[j])
break;
j++;
}
/*如果相同则重新给这位赋值*/
if(j<i)
continue;
i++;
}
for(i=0;i<10;i++)
printf("%3d",a[i]);
getch();
}
----------------解决方案--------------------------------------------------------
楼上的有几个小问题:1 种子没有初始化,所以每次产生的随即10位数相同
2 既然是10位数,那就不是数组,输出时没必要加空格
[CODE]
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
void main()
{
int i,j;
int a[10]={0};
randomize(); /*初始化种子*/
a[0]=rand()%9+1;
for(i=1;i<10;i++)
{
a[i]=rand()%10;
for(j=0;j<i;j++)
if(a[i]==a[j])
break;
if(j<i)
i--;
}
for(i=0;i<10;i++)
printf("%d",a[i]);
getch();
}
[/CODE]
----------------解决方案--------------------------------------------------------
二楼和三楼的方法都可行,不过算法复杂度都比较高,就是说,每新生成一个数之后,就要跟所有已经存在的数比较是否重复,如果始终重复,程序就始终结束不了,只有10个数时还可以,随着需要输入的数的增加重复率会越来越高,最后几乎无法完成。
为保持运行时间,应该建立链表(link list),把0~最大值中的所有数顺序放进去,每用掉一个就从list中删一个,下次rand()的时候上限减1,这样可以保证复杂度是O(N)。
----------------解决方案--------------------------------------------------------
我就纳闷了,你们为什么全都写getch()啊,我都是用getchar()的,你们都用的什么软件啊,我用的c-free是不是不好用啊。谢谢了。
----------------解决方案--------------------------------------------------------
为什么每次运行这个程序时这十个数都会是同一个次序排列呢,
----------------解决方案--------------------------------------------------------
为什么?看三楼
----------------解决方案--------------------------------------------------------
4楼说得不错
----------------解决方案--------------------------------------------------------
其实还有很多算法的,因为这题就和 有10个岛,要求旅游团一次性走完这10个岛屿而且不能经过已经观光过的岛屿的算法是一样的,我在图书馆看到一本介绍离散数学的书里面有~~遗憾的是。。我忘记名称了...
----------------解决方案--------------------------------------------------------
另外。更正下4楼的,如果把随即数的产生所需要的时间也算进去,那么就不是O(N)那么简单的事情了
----------------解决方案--------------------------------------------------------