一个简单的组合算法,得到答案,马上接贴~~ 数组 {a,b,c,d,e}(可以任意数值),个数为4,要写一个方法Select(int k),能够列出5选k所有组合(注意不是组合数),比如k=2时,列出5选2的组合;k=3时,列出5选3的组合。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 找到一个C的,自己改改吧!! #include <iostream.h> #include <list.h> char* trimStr(char *str) { char *p; p=str; while(p[0]==' ') p++; return p; } list<char*> parseToList(char *str,char *dlm) { char *oneword; list<char*> lst; char str1[1024]; strcpy(str1,str); char *p1; char *p2; char *p3; p1=str1; p2=p1; while(p1) { p2=p1; p1=strstr(p1,dlm); if(p1) { p3=p1; p1++; *p3=0; } oneword=new char[strlen(p2)+1]; strcpy(oneword,p2); lst.push_back(oneword); } return lst; } list<char*> strAddList(char* str,list<char*> lst) { list<char*> result; char *p; list<char*>::iterator it; int slen=strlen(str); for(it=lst.begin();it!=lst.end();it++) { p=new char[slen+strlen(*it)+2]; strcpy(p,str); strcat(p," "); strcat(p,*it); result.push_back(p); } return result; } list<char*> addList(list<char*> lst1,list<char*> lst2) { char *p; list<char*> result; list<char*>::iterator it1; for(it1=lst1.begin();it1!=lst1.end();it1++) { p=new char[strlen(*it1)+1]; strcpy(p,*it1); result.push_back(p); } for(it1=lst2.begin();it1!=lst2.end();it1++) { p=new char[strlen(*it1)+1]; strcpy(p,*it1); result.push_back(p); } return result; } list<char*> combo(char *str,int n,int m) { list<char*> strlst; strlst=parseToList(str," "); int i=strlst.size(); list<char*>::iterator it; char *argStr; char *oneCombo; char *one; char temp[10]; list<char*> result; if(m==1) { for(it=strlst.begin();it!=strlst.end();it++) { oneCombo=new char[strlen(*it)+1]; strcpy(oneCombo,*it); result.push_back(oneCombo); } return result; }else if(n==m) { one=new char[100]; one[0]=0; for(it=strlst.begin();it!=strlst.end();it++) { strcat(one," "); sprintf(temp,"%s",*it); strcat(one,temp); } strcpy(one,trimStr(one)); oneCombo=new char[strlen(one)+1]; strcpy(oneCombo,one); result.push_back(oneCombo); return result; }else { argStr=new char[1024]; argStr[0]=0; it=strlst.begin(); for(int k=0;k<=n-m;k++) // for(it=strlst.begin();it!=strlst.end();it++) { list<char*>::iterator it2; int j=0; it2=it; argStr[0]=0; for(it2++;it2!=strlst.end();it2++) { j++; strcat(argStr," "); strcat(argStr,*it2); } strcpy(argStr,trimStr(argStr)); list<char*> parLst; parLst=strAddList(*it,combo(argStr,j,m-1)); result=addList(result,parLst); it++; } return result; } } int main(int argc, char* argv[]) { char str1[100]; strcpy(str1,"hello world fsrong and xxf"); list<char*> lst; list<char*>::iterator it; lst= combo(str1,5,2); for(it=lst.begin();it!=lst.end();it++) cout<<*it<<endl; cin>>str1; return 0; } import java.io.*;public class Test { public static void main(String[] args) { select(3); } private static void select(int k){ char[] result = new char[k]; subselect(0, 1, result, k); } private static void subselect(int head, int index, char[] r, int k) { for(int i=head; i<a.length+index-k; i++) { if(index < k){ r[index-1] = a[i]; subselect(i+1, index+1, r, k); }else if(index == k){ r[index-1] = a[i]; System.out.println(r); subselect(i+1, index+1, r, k); }else{ return; } } } private static char[] a = {'a', 'b', 'c', 'd', 'e'};} 没学过高数吗? 从n个数里取出m个数的组合是n*(n-1)*...*(n-m+1)/m*(m-1)*...2*1 to cpl3113(小龙):我学过高数,不过高数里没有排列组合,排列组合是在高一高二代数学的课程,再说,组合公式只能求出组合数,能列出所有的组合情况吗?andycpp(幻瞳) 的方法我试过了,可行。 java 问题,请教....... swing 相关资料(中文) 急问。o(∩_∩)o..关于JAVA的一些学习。大家来说说。 Sun HotSpot VM 垃圾回收调优 (在线等待,高分)多个人同时访问页面出现的问题 初学求助 偶觉的Thinking in java(第二版)一点都不好!! 高分求助struts的问题 String -> Date 出现错误!方法试了很多----我的分太少了,只能这么多了 有工具把C++代码变成JAVA代码吗? 怎么一用button调用函数就死机呢 求:随机生成一万个五位数字,用什么方法好生成好,而且要不能重复的数字,有什么好的办法
#include <iostream.h>
#include <list.h>
char* trimStr(char *str)
{
char *p;
p=str;
while(p[0]==' ')
p++;
return p;
}
list<char*> parseToList(char *str,char *dlm)
{
char *oneword;
list<char*> lst;
char str1[1024];
strcpy(str1,str);
char *p1;
char *p2;
char *p3;
p1=str1;
p2=p1;
while(p1)
{
p2=p1;
p1=strstr(p1,dlm);
if(p1)
{
p3=p1;
p1++;
*p3=0;
}
oneword=new char[strlen(p2)+1];
strcpy(oneword,p2);
lst.push_back(oneword);
}
return lst;
}
list<char*> strAddList(char* str,list<char*> lst)
{
list<char*> result;
char *p;
list<char*>::iterator it;
int slen=strlen(str);
for(it=lst.begin();it!=lst.end();it++)
{
p=new char[slen+strlen(*it)+2];
strcpy(p,str);
strcat(p," ");
strcat(p,*it);
result.push_back(p);
}
return result;
}
list<char*> addList(list<char*> lst1,list<char*> lst2)
{
char *p;
list<char*> result;
list<char*>::iterator it1;
for(it1=lst1.begin();it1!=lst1.end();it1++)
{
p=new char[strlen(*it1)+1];
strcpy(p,*it1);
result.push_back(p);
}
for(it1=lst2.begin();it1!=lst2.end();it1++)
{
p=new char[strlen(*it1)+1];
strcpy(p,*it1);
result.push_back(p);
}
return result;
}
list<char*> combo(char *str,int n,int m)
{
list<char*> strlst;
strlst=parseToList(str," ");
int i=strlst.size();
list<char*>::iterator it;
char *argStr;
char *oneCombo;
char *one;
char temp[10];
list<char*> result;
if(m==1)
{
for(it=strlst.begin();it!=strlst.end();it++)
{
oneCombo=new char[strlen(*it)+1];
strcpy(oneCombo,*it);
result.push_back(oneCombo);
}
return result;
}else
if(n==m)
{
one=new char[100];
one[0]=0;
for(it=strlst.begin();it!=strlst.end();it++)
{
strcat(one," ");
sprintf(temp,"%s",*it);
strcat(one,temp);
}
strcpy(one,trimStr(one));
oneCombo=new char[strlen(one)+1];
strcpy(oneCombo,one);
result.push_back(oneCombo);
return result;
}else
{
argStr=new char[1024];
argStr[0]=0;
it=strlst.begin();
for(int k=0;k<=n-m;k++)
// for(it=strlst.begin();it!=strlst.end();it++)
{ list<char*>::iterator it2;
int j=0;
it2=it;
argStr[0]=0;
for(it2++;it2!=strlst.end();it2++)
{
j++;
strcat(argStr," ");
strcat(argStr,*it2);
}
strcpy(argStr,trimStr(argStr));
list<char*> parLst;
parLst=strAddList(*it,combo(argStr,j,m-1));
result=addList(result,parLst);
it++;
}
return result;
}
}
int main(int argc, char* argv[])
{
char str1[100];
strcpy(str1,"hello world fsrong and xxf");
list<char*> lst;
list<char*>::iterator it;
lst= combo(str1,5,2);
for(it=lst.begin();it!=lst.end();it++)
cout<<*it<<endl;
cin>>str1;
return 0;
}
select(3);
}
private static void select(int k){
char[] result = new char[k];
subselect(0, 1, result, k);
}
private static void subselect(int head, int index, char[] r, int k) {
for(int i=head; i<a.length+index-k; i++) {
if(index < k){
r[index-1] = a[i];
subselect(i+1, index+1, r, k);
}else if(index == k){
r[index-1] = a[i];
System.out.println(r);
subselect(i+1, index+1, r, k);
}else{
return;
}
}
} private static char[] a = {'a', 'b', 'c', 'd', 'e'};
}
andycpp(幻瞳) 的方法我试过了,可行。