关于字符串组合方法-2
有个?字符串数组
str[0] = {"str00","str01",...,"str0m"}
str[1] = {"str10","str11",...,"str1m"}
...
str[n] = {"strn0","str2",...,"strnm"}
有啥简便方法可得到他们的所有组合的结果?
newstr[0] = str00,str10,...strn0
newstr[1] = str00,str10,...strn1
...
newstr[n+1] = str00,str11,...strn0
newstr[n+2] = str00,str12,...strn0
...
问题点数:50、回复次数:6Top
1 楼Kevin_qing()回复于 2000-06-15 13:31:00 得分 0
char ** str=new char [n*m][MAX_LENG];
int i=0;
for(int n=0;n<N;n++)
for (int m=0;m<M;m++)
{
}Top
2 楼Kevin_qing()回复于 2000-06-15 13:47:00 得分 15
char str[N*M][MAX_LENG];
int i=0;
for(int n=0;n<N;n++)
for (int m=0;m<M;m++)
{
sprintf(str[i++],"str%02d%02d",n,m);
}
结果是
str0000
str0001
str0002
str0100
str0101
str0102
str0200
str0201
str0202
str0300
str0301
str0302
Top
3 楼zjy()回复于 2000-06-15 16:23:00 得分 0
Kevin_qing先生,我要的不一定是两个数组的组合,
这是个标准的数学上的组合问题,Thank you
Top
4 楼WHQ()回复于 2000-06-15 17:58:00 得分 35
下面这个总可以吧:
#include <stdio.h>
// N个数的全排列:
typedef void (*MyOutputFunc)(int numb, char out[]);
void Iterate(int n, char in[], char out[], int nmax, int& numb, MyOutputFunc f)
{
if( n == 0 )
{
f(numb++, out);
return;
}
for(int i = 0; i < nmax; i++)
{
if( in[i] != -1 )
{
out[nmax-n] = in[i];
in[i] = -1;
Iterate(n-1, in, out, nmax, numb, f);
in[i] = out[nmax-n];
}
}
}
void PrintP(int numb, char out[])
{
printf("[%08d]: %s\n", numb, out);
}
#define MAX 62
main()
{
char in[MAX+1], out[MAX+1];
int numb = 0;
for( int i = 0; i < MAX; i++ )
{
if( i < 26 ) in[i] = 'a'+i;
else if( i < 52 ) in[i] = 'A'+i-26;
else in[i] = '0'+i-52;
out[i] = -1;
}
in[i] = out[i] = 0;
Iterate(MAX, in, out, MAX, numb, PrintP);
printf("\nAll items are %d\n", numb);
return 0;
}
Top
5 楼zjy()回复于 2000-06-21 15:34:00 得分 0
我明白了,这是我的方法:
nTotal = 1;
for(i = 0;i<n;i++){
nTotal = nTotal * m[i];
}
mCount[0] = 1;
for(i=1;i<nUseTimes;i++){
mCount[i] = m[i-1] * mCount[i-1];
}
int nMod;
String[] sCombo = new String[nTotal][nUseTimes];
for(i = 0;i < nTotal;i ++){
for(j=0;j<nUseTimes;j++){
nMod = (i / mCount[j]) % nCount[j];
sCombo[i][j] = sTimeLists[j][nMod];
}
}
Top




