求十个数取其三的算法

ninjaBiao 2003-01-06 09:25:54
0-9十个数任意取三个数,如何显示其120种组合??
如果是m取n呐?希望有比较简单的算法!先谢谢各位回贴人!
第一个写出能使我看懂的算法者得奖分!
...全文
82 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdspower 2003-01-08
  • 打赏
  • 举报
回复
//按lins(*有为青年*)思路实现的代码,其实这样作是比较麻烦的
#include <stdio.h>
int f10(int count) //计算10的count次幂
{
int i=1;
for (int n=0;n< count;n++)
i*=10;
return i;
}
int main(int argc, char *argv[])
{
int a[10]={0,1,2,3,4,5,6,7,8,9};
int k;//自增量表示(00 0000 0000)b到(11 1111 1111)b
int count;//用于计数k中置1的位
int i;//控制位运算时取值的位
int show;//显示用的值
int all=0;
for(k=0;k<0x400;k++)
{
count=0;show=0;
for(i=0;i<10;i++)
{
if((1<<i)&k)
{
show+=a[i]*f10(count);
count++;
}
if( count>3) break;
}
if (3==count){all++; printf("%d is a seleted\n",show);}
}
printf("all is %d\n",all);
return 0;
}
xdspower 2003-01-08
  • 打赏
  • 举报
回复
lins(*有为青年*)的方法可行但不一定简单,这要涉及到位运算了
xdspower 2003-01-07
  • 打赏
  • 举报
回复
其实本题就是完全显示从0-9的数字中取3个的组合,根本没有随机数没有多复杂的,完全可以用循环来完成。
void main(void)
{
int i;//控制组合的首数
int j;//控制组合的第二个数字
int k;//控制组合的第三个数字
int conut=0;//计数
for(i=0;i<=7;i++)
{
j=i+1;
for (;j<=8;j++)
{
k=j+1;
for(;k<=9;k++)
{
printf("%d,%d,%d\n",i,j,k);
conut++;
}
printf("*****************\n");
}
printf("=======================\n");
}
printf ("count is %d\n",conut);
}

输出结果为
0,1,2
0,1,3
0,1,4
0,1,5
0,1,6
0,1,7
0,1,8
0,1,9
*****************
0,2,3
0,2,4
0,2,5
0,2,6
0,2,7
0,2,8
0,2,9
*****************
0,3,4
0,3,5
0,3,6
0,3,7
0,3,8
0,3,9
*****************
0,4,5
0,4,6
0,4,7
0,4,8
0,4,9
*****************
0,5,6
0,5,7
0,5,8
0,5,9
*****************
0,6,7
0,6,8
0,6,9
*****************
0,7,8
0,7,9
*****************
0,8,9
*****************
=======================
1,2,3
1,2,4
1,2,5
1,2,6
1,2,7
1,2,8
1,2,9
*****************
1,3,4
1,3,5
1,3,6
1,3,7
1,3,8
1,3,9
*****************
1,4,5
1,4,6
1,4,7
1,4,8
1,4,9
*****************
1,5,6
1,5,7
1,5,8
1,5,9
*****************
1,6,7
1,6,8
1,6,9
*****************
1,7,8
1,7,9
*****************
1,8,9
*****************
=======================
2,3,4
2,3,5
2,3,6
2,3,7
2,3,8
2,3,9
*****************
2,4,5
2,4,6
2,4,7
2,4,8
2,4,9
*****************
2,5,6
2,5,7
2,5,8
2,5,9
*****************
2,6,7
2,6,8
2,6,9
*****************
2,7,8
2,7,9
*****************
2,8,9
*****************
=======================
3,4,5
3,4,6
3,4,7
3,4,8
3,4,9
*****************
3,5,6
3,5,7
3,5,8
3,5,9
*****************
3,6,7
3,6,8
3,6,9
*****************
3,7,8
3,7,9
*****************
3,8,9
*****************
=======================
4,5,6
4,5,7
4,5,8
4,5,9
*****************
4,6,7
4,6,8
4,6,9
*****************
4,7,8
4,7,9
*****************
4,8,9
*****************
=======================
5,6,7
5,6,8
5,6,9
*****************
5,7,8
5,7,9
*****************
5,8,9
*****************
=======================
6,7,8
6,7,9
*****************
6,8,9
*****************
=======================
7,8,9
*****************
=======================
count is 120
teal 2003-01-07
  • 打赏
  • 举报
回复
//上一贴中的内容
*************************************************************
可以是这样吧
定义三个数组
a1[1]={0,1,2,3,4,5,6,7,8,9}
a2[10]={0,1,2,3,4,5,6,7,8,9}
a3[10]={0,1,2,3,4,5,6,7,8,9}
q1,q2,q3,为组合
先假设有一个产生随即数的函数 rand(n):产生一个从0-n 的随机整数
for(i=10;i>;i++)
{
x=rand(i);
q1=a1[x]//得到第一个数
for(j=10;j>0;j++)
{
x=rand(j)
q2=a2[x] //得到第2个数
for(k=10;k>0;k++)
{
x=rand(k)
q3=a3[x] //得到第三个数
dele(a3[k]) //删除a3[k]并将其后的元素前移
}
dele(a2[j]) //删除a2[j]并将其后的元素前移
}
dele(a1[i]) //删除a1[i]并将其后的元素前移
}
对于 n,m 的 同理
**********************************************************

//回去睡一觉后发现上面的算法有问题:
问题1:
找出第一组以后破坏整个数组使后面无法选择
问题2:
即使问题1已经不存在,则上述算法解决得只是排列的问题,并不是自由组合

要解决上述问题 ,改进的算法如下
*******************************************************

定义1个数组
a1[10]={0,1,2,3,4,5,6,7,8,9}
先假设有一个产生随即数的函数 rand(n):产生一个从0-n 的随机整数
for(i=10;i>;i--)
{
x=rand(i);
temp=a1[x]//得到第一个数,将其与第i个元素交换位置
a1[x]=a1[i]
a1[i]=temp
for(j=i;j>0;j--)
{
x=rand(j)
temp=a1[x]//得到第二个数,将其与第j个元素交换位置
a1[x]=a1[j]
a1[j]=temp
for(k=j;k>0;k--)
{
x=rand(k)
temp=a1[x]//得到第三个数,将其与第k个元素交换位置
a1[x]=a1[k]
a1[k]=temp
printf(a[i],a[j],a[k])
}
}
}
对于 n,m 的 同理
BambooTang 2003-01-07
  • 打赏
  • 举报
回复
faint!
huangyun 2003-01-07
  • 打赏
  • 举报
回复
有没有用VB编的
wangweicai 2003-01-07
  • 打赏
  • 举报
回复
lins(*有为青年*):你这种方法好。
howelltech 2003-01-06
  • 打赏
  • 举报
回复
public class test1 {
private int a,b,c;
public void sort() {
for(a=1;a<=5;a++) {
for(b=a+1;b<=5;b++) {
for(c=b+1;c<=5;c++) {
System.out.println("a = "+a+"b = "+b+"c = "+c);
}
}
}
}
public static void main(String[] args) {
new test1().sort();
}
}
frman 2003-01-06
  • 打赏
  • 举报
回复
#include <stdio.h>

int IsEnd(int *rec, int m, int n)
{
int i, j, k;

j = 0;
for ( i = n; i >= 1; i--)
{
if ( rec[i] < m-j )
return i;
j++;
}
return 0;
}

int Go(int m, int n)
{
int i, j, k;
int rec[100];

for ( i = 1; i <= n; i++)
{
rec[i] = i;
printf("%d ", rec[i]);
}
printf("\n");

while ( (k = IsEnd(rec, m, n)) != 0)
{
rec[k]++;
for ( i = k+1; i <= n; i++) rec[i] = rec[k]+(i-k);
for ( i = 1; i <= n; i++) printf("%d ", rec[i]);
printf("\n");
}

return 0;
}

int main()
{
int m, n;
printf("input M N:");
scanf("%d%d", &m, &n);
Go(m, n);
return 0;
}
林仪明 2003-01-06
  • 打赏
  • 举报
回复
这样的问题不知道问了多少次
用2进制数来表示
0123456789
0000000001,表是选一个数9。
明白了吗

0123456789
0010101000,是一种选择方案
teal 2003-01-06
  • 打赏
  • 举报
回复
for(k=10;k>0;k++)
{
x=rand(k)
q3=a3[x] //得到第三个数
printf( q1,q2,q3) // 在这里输出
dele(a3[k]) //删除a3[k]并将其后的元素前移
}
teal 2003-01-06
  • 打赏
  • 举报
回复
可以是这样吧
定义三个数组
a1[1]={0,1,2,3,4,5,6,7,8,9}
a2[10]={0,1,2,3,4,5,6,7,8,9}
a3[10]={0,1,2,3,4,5,6,7,8,9}
q1,q2,q3,为组合
先假设有一个产生随即数的函数 rand(n):产生一个从0-n 的随机整数
for(i=10;i>;i++)
{
x=rand(i);
q1=a1[x]//得到第一个数
for(j=10;j>0;j++)
{
x=rand(j)
q2=a2[x] //得到第2个数
for(k=10;k>0;k++)
{
x=rand(k)
q3=a3[x] //得到第三个数
dele(a3[k]) //删除a3[k]并将其后的元素前移
}
dele(a2[j]) //删除a2[j]并将其后的元素前移
}
dele(a1[i]) //删除a1[i]并将其后的元素前移
}
对于 n,m 的 同理

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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