一个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可以自定,并且列出来的所有组合可以打印出来,或是可以导出文本文件。
...全文
969 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
我是问问题的,希望有人帮忙解决的,不是给你们做宣传的
加载更多回复(22)
BMP magic是一个新型的加密软件,你可以用它把任何格式的windows文件存入到一幅24位真彩色的BMP图片中,神奇的是这幅内部藏有文件的图片的尺寸、大小不变! 在接下来的文字中您会了解到关于这个新版软件的强大功能与安全算法:在5.0B版本中:★支持jpg格式! 在本版本中,新加入了对jpg格式的自动转换——如果您打开的是一幅jpg图片,程序会自动转换为bmp格式来处理,不用事再用其它工具转换。★可以隐藏比图片自身大若干倍的文件! 您要相信自己的眼睛:一幅200K的24位BMP,利用本程序成功地将一个1474.56K=1.44兆的WPS文件隐藏于其中!而且这还不是软件创的最高记录。★通过一系列优化算法,使隐藏文件的图片画质得到最大程序的提升! 一幅图片在最大限度上隐藏外部文件后,画质依然清晰,色彩过渡仍很平滑,基本不存在色块问题。这种算法理论上还未达到极限,后续版本中还将继续改进算法使画质进一步提升。★引领数据压缩领域新潮流! 目前最进的压缩工具对文本文件的压缩率也不过90%,然而利用本软件将图片隐藏文件后再压缩,却有望突破这一“极限”压缩率!基于此种组合压缩法,阁下的160G海量硬盘是否可以多出几十G呢?★独创的255位动态密钥加密术让数据隐藏的更安全! 传统加密法采用常量作加密密钥不少解密高手正是利用这一普遍规律分析加密算法从而成功将所谓的“安全数据”解密。本软件自这一版本起采用最前沿的“动态密钥加密算法”使被加密的数据安全性能有了一个“质”的飞跃!也就是说,即使您用同一幅图片隐藏同一个文件,每次生成的新图片内部数据绝对是不一样的!★采用多种加密方式加密数据,无须担心数据传递过程的“中介者”! 新版软件中采用六种方式加密数据: 1.日期时间锁定; 2.外部软件锁定; 3.程序版本识别; 4.机器硬件锁定; 5.操作系统识别; 6.解密口令锁定。 这六种方式可以任意组合,现分别说明如下: A.采用“日期时间”限制时,您可以输入自1985-2099年间的任何时间(精确到秒),这样数据被加密后,解密者如不是在设定的时间企图解密将得不到正确的隐藏文件; B.采用外部软件锁定时,你可以选择你机器上有的任何一个文件做为锁定用程序,对方在解密时,必要性要用同样的文件来做为密匙才能解开里面的密文(你用的是什么文件,在“图文信息”中是查看不到的!)。 C.程序版本识别,也就是说,你用某一个版本的BMP magic加密了文件后,用其它版本的BMP magic是无法解开里面的密文的,换句话说,就是我们开发的程序,没有设置“向下兼容”; D.机器硬件锁定,你可以用你机器上的任何一个驱动器作为锁定密匙,包括硬盘逻辑分区,光盘,软盘,这样,除了在你的硬件环境中,别人将无法得到正确的加密文件; E.操作员识别,你选用“操作系统识别”后,就只能在相同的操作系统下解开密文,并且,在“图文信息”中不会标识出系统类型; F.采用“用户口令”限制时,您可以输入最长255位的密码(可以是您有办法输入其中的任何字符,当然有中文啦...)。★在图片中的任何添加数据(包括添加的文件头部信息)均用不同密钥加密,如不利用本软件根本提取不到任何有用的信息!这使数据的安全保密性得以极端的提高!★图片中可以像电子邮件一样附加“发送人”、“接收人”、“主题”及留言信息,使加密后的图片交互性更强,十二分的人性化设计!...... 共享软件时代,加密软件数不胜数,相信阁下在看到上面的文字后会在选择加密软件方面有一个成熟的理念,同时我们也相信,这个最新版的软件会带给您生活与工作上的方便与惊喜!********************************************************* 在您使用本软件之前,希望事能与阁下达成下面的协议: 1.本软件纯属利用娱乐创意编写,参与软件编写的所有人员均不会对您由于使用本软件所造成的一切后果与损失负责! 2.本软件加密技术相当进,属于“一次性加密”,故软件作者不会接受任何人员提出的“数据抢救”询求,阁下自我保重! 3.本软件的所有流行版本严禁任何组织或个人对其进行反编及商业炒作或以作者名义营利,但欢迎在不影响版权时传播与发布! 如果用户使用本软件,就表示默认上述许可,否则销毁本软件! ********************************************************* 经测试,本软件在Window9x/Me/NT/2000/XP运行稳定并无不安全因素敬放心使用并烦劳扩充测试,谢谢! 感谢众多朋友帮忙测试软件!

70,035

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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