一个C问题,请高手帮忙!~ 先谢谢啊 !~~~

vitor_cx 2006-11-08 10:27:51
找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为:
(1)1、2、3 (2)1、2、4 (3)1、2、5
(4)1、3、4 (5)1、3、5 (6)1、4、5
(7)2、3、4 (8)2、3、5 (9)2、4、5
(10)3、4、5
排列中不要出现如 123 132 321这种3个数完全相同的组合。
写个小程序,n和r可以自定,并且列出来的所有组合可以打印出来,或是可以导出文本文件。
...全文
885 点赞 收藏 43
写回复
43 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
vitor_cx 2006-11-14
我自己学的有错啊!~~不知道该怎么写啊?有没有高手帮忙啊?
找出从自然数01、02、……、n中任取r个数的所有组合(n<100)。例如n=5,r=3的所有组合为:
(1)1、2、3 (2)1、2、4 (3)1、2、5
(4)1、3、4 (5)1、3、5 (6)1、4、5
(7)2、3、4 (8)2、3、5 (9)2、4、5
(10)3、4、5
排列中不要出现如 123 132 321这种3个数完全相同的组合。
写个小程序,n和r可以自定,并且列出来的所有组合可以打印出来,或是可以导出文本文件。
回复
rachelQin 2006-11-12
学习,呵呵
回复
wwxtu24 2006-11-12
汗,这么多高手。编程还是要细心,别急,先自己run一遍再发给别人吧。
回复
vitor_cx 2006-11-12
现在改一下,把自然数1.2.3.....n改成01.02.03....n,后面的条件都是一样的,有谁能帮我写个程序啊!~我不知道怎么改啊?谢谢啊!~~
回复
yushuiqing99 2006-11-10
汗!对于初学者来读那么复杂的程序,会很吃力的,而且很不好理解,我的算法,时间复杂度没有各位高手的好,但是对于初学者是绝对能读懂,思路绝对清晰,绝对无错的!楼主,试试吧
回复
yushuiqing99 2006-11-10
#include<stdio.h>
int main()
{int l,i,j,k,m=0;
scanf("%d",&l);
for(i=1;i<=l;i++)
for(j=i+1;j<=l;j++)
for(k=j+1;k<=l;k++)
{ m++;
if(m%10==0)printf("\n");
printf(" %d%d%d",i,j,k);
};
return 0;
}
回复
yushuiqing99 2006-11-09
按你的例子可以这么写
还有楼上面的5改为l,r也自己改吧;
忘记了改
#include<stdio.h>
int main()
{int l,i,j,k,m;
scanf("%d",&l);
for(i=1;i<=l;i++)
for(j=i+1;j<=l;j++)
for(k=j+1;k<=l;k++)
m++;
if(m%10==0)
{printf(" %d%d%d",i,j,k);}
else printf("/n");
return 0;
}
回复
yushuiqing99 2006-11-09
你举的例有问题吧!3个不能一样
但是121也可以啊
我也刚学完C语言
算法不太好,时间复杂性不好
但能用
算法如下:
#include<stdio.h>
int main()
{int l,i,j,k,m;
scanf("%d",&l);
for(i=1;i<=5;i++)
for(j=i;j<=5;j++)
for(k=j;k<=5;k++)
m++;
if(m%10==0)
{printf(" %d%d%d",i,j,k);}
else printf("/n");
return 0;
}
修饰性的东西就没有加了
基本思想很清晰!
回复
left_zxp 2006-11-09
mark
回复
vc_bad_girl 2006-11-09
由于?汗..这个问题真的很难解决吗?
回复
malligator 2006-11-09
不是吧??
不过我上边那个确实有问题.
改正如下:(如仍有错且不会改,请将错误贴上来,我帮改)
以下是经过我详细检查的了

另外,由于记不太准,我把它定死成n=1,r=3了,可改之
==========================================================

#include <stdio.h>

int judge(int a[],int n)
{
for(int i=n-1;i>0;i--)
if(a[i]==0&&a[i-1]==1) return 1; //存在紧靠着的[10]

return 0;
}

void co( )
{
int a[5] ;
int counter=0,n=5,r=3;

for(int i=0;i<r;i++) //初始化:r个1
a[i]=1;
for(int i=r;i<n;i++) //初始化:n-r个0
a[i]=0;

while(1==judge(a,n)) //判断是否打印完
{
printf("%d : ",++counter); //打印一组结果
for(int i=0;i<n;i++)
if(a[i]==1) printf("%d",i+1);
printf("\n");

for(int i=n-1;i>0;i--)
if(a[i]==0&&a[i-1]==1) //将存在紧靠着的第一个[10]对换位置
{
a[i]=1;
a[i-1]=0;
for(int j=i+1;j<n-j+i;j++)
{
if(a[j]==0&&a[n-j+i]==1)
{
a[j]=1;
a[n-j+i]=0;
}
}
break;
}
}

printf("%d : ",++counter); //打印最后一组结果
for(int i=0;i<n;i++)
if(a[i]==1) printf("%d",i+1);
printf("\n");

printf("\nThe total is :%d\n",counter);//结果总个数

}

int main()
{
co();

return 0;
}
回复
gql_w 2006-11-09
从n个数中取r个,没有顺利,123根321认为一样。python代码

def get_arrange_no_sort(n, r) :
result = []
result.append(range(1, r+1))
for i in range(r+1, n+1) :
tmp = []
for item in result :
for index in range(0, 3) :
tmp2 = []
if index == 2 :
tmp2.append(item[0])
tmp2.append(item[2])
else :
tmp2.append(item[index])
tmp2.append(item[index+1])
tmp2.append(i)
tmp.append(tmp2)
result.extend(tmp)
return result

if __name__ == '__main__' :
result = get_arrange_no_sort(6, 3)
print len(result)
for item in result :
print item
回复
qhl1229 2006-11-09
#include <stdio.h>
#include <malloc.h>
//int j = 0;
typedef struct
{
int *store; //save the value of the array argument
int *headlist; //save the first address of the array argument
int numofcmb; //save the value of "list_len"
}T_DATA_STORE;

void Combinationrecursion(int * ,int , int ,T_DATA_STORE *);

//***********************************************************************************
//Function :
// Combination():difining variable and using Combinationrecursion() funcion
//Argument :
// *list : the address of the array argument
// list_len : the number of the array argument
// cmb : the number of the combination
//Return value:
// void
//***********************************************************************************
void Combination(int *list,int list_len, int cmb)
{
T_DATA_STORE t;
t.store = (int *)malloc((cmb) * sizeof(int));
t.headlist = list;
t.numofcmb = cmb;

Combinationrecursion(list, list_len, cmb, &t);
free(t.store);
}

//***********************************************************************************
//Function :
// recursion():count Combination of the recursion
//Argument :
// *list : the address of the array argument
// list_len : the number of the array argument
// cmb : the number of the combination
// *save : the struct save the value of the array and the first address
// of the array and the list_len
//Return value :
// void
//***********************************************************************************
void Combinationrecursion(int * list,int list_len, int cmb, T_DATA_STORE *save)
{
int i = 0;

if(cmb == 0) //output
{
for( i = save->numofcmb - 1; i >= 0; i-- )
{
printf("%d",save->store[i]);
}
// j++;
printf("\n");
return;
}

for(i = (list - save->headlist)/sizeof(list); i <= list_len; i++, list++)
{
if(list < save->headlist + list_len + save->numofcmb - 1)
{
save->store[cmb - 1] = *list; //store the data
Combinationrecursion(list + 1, list_len - 1, cmb - 1, save);
}
}
}

int main(void)
{
int b[]={1,2,3,4,5,6,7,8,9};
Combination(&b[0],5,3);
printf("\n");
// printf("\nj=%d",j);
return 0;
}
回复
vitor_cx 2006-11-09
上面算法的judge少了个条件了,不好意思!
少了个什么条件啊?
回复
vitor_cx 2006-11-09
楼上的说的也对。有谁可以给个没有错误的啊!~~
回复
vc_bad_girl 2006-11-09
关注.....
回复
vc_bad_girl 2006-11-09
我 的天哪...各位大虾..请在帮助人的时候自己先调试好自己的程序..对于新手一些错误是很苦恼的!以上哪位的程序能正确运行?
回复
vitor_cx 2006-11-09
没什么,我自己调试看看,不会了在问你啊
回复
malligator 2006-11-09
#include <stdio.h>

int judge(int a[],int n)
{
for(int i=0;i<n-1;i++)
if(a[i]==1&&a[i+1]==0) return 1; //存在紧靠着的[10]

return 0;
}

int co(int n,int r)
{
int *a ;
int counter=0;
a=(int*)malloc(n*sizeof(int));

for(int i=0;i<r;i++) //初始化:r个1
a[i]=1;
for(int i=r;i<n;i++) //初始化:n-r个0
a[i]=0;

while(1==judge(a,n)) //判断是否打印完
{
printf("%d:",++counter); //打印一组结果
for(int i=0;i<n;i++)
if(a[i]==1) print("%d",i+1);
printf("\n");

for(int i=0;i<n-1;i++)
if(a[i]==1 and a[i+1]==0) //将存在紧靠着的第一个[10]对换位置
{
a[i]=0;
a[i+1]=1;
break;
}
}
printf("%d:",++counter); //打印一组结果
for(int i=0;i<n;i++)
if(a[i]==1) print("%d",i+1);

printf("\n\nThe total is :%d",counter);//结果总个数

free(a);

}

int main()
{
int n,r;
printf("\ninput the n and r(n>=r):");
scanf("%d%d",&n,&r);

co(n,r);

return 0;
}

================
这是完整程序了——没有编译器,可能稍有语法错误。

另外,上面算法的judge少了个条件了,不好意思!
回复
vitor_cx 2006-11-09
我是问问题的,希望有人帮忙解决的,不是给你们做宣传的
回复
加载更多回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2006-11-08 10:27
社区公告
暂无公告