1、2、3三个数,排列最终结果如下:
111 121 131
112 122 132
113 123 133211 221 231
212 222 232
213 223 233311 321 331
312 322 332
313 323 333用递归解决。要求可扩展,即不限制无素个数。
111 121 131
112 122 132
113 123 133211 221 231
212 222 232
213 223 233311 321 331
312 322 332
313 323 333用递归解决。要求可扩展,即不限制无素个数。
void aaaa(int r, int s, int b)
{
for (int i = 1; i <= r; i++)
{
ss[s] = '0' + i;
if (s == b - 1)
{
ss[s + 1] = 0;
printf(ss);
printf("\r\n");
}
else
aaaa(r, s + 1, b);
}
}
void aaaa(int r, int s, int b)
{
int i;
for (i = 1; i <= r; i++)
{
ss[s] = '0' + i;
if (s == b - 1)
{
ss[s + 1] = 0;
printf(ss);
printf(" ");
}
else
aaaa(r, s + 1, b);
}
printf("\r\n");
}void main()
{
aaaa(3, 0, 3);
}改进了一下,你的情况,调用方法为
aaaa(3, 0, 3); 这个函数,第二个参数调用时,都为0,第一个参数为取范围,比如4,则取值范围为1到4,第三个参数为组成的数字的位数,比如4,则为一个4位数:
1111 1112 1113
1121 1122 1123...
ss[s] = '0' + i;
//origin[]是你存储所有需要排序的字符的数组
//char origin[10]={a,b,c,d,e,f,g..}
改为ss[s] = origin[i];换成任意字符串的话,ss的类型需要改成指针数组,origin[]也是。
原理都一样。
char ss[128];
pai1(str,strlen(str),0,strlen(str));//调用
void CPasswordArrayDlg::pai1(char origin[],int r, int s, int b)
{
int i;
for (i = 1; i <= r; i++)
{
ss[s] = origin[i];
if (s == b - 1)
{
ss[s + 1] = 0;
sum++;
temp.Format("%ld\t",sum);
file.Write(temp,temp.GetLength());
file.Write(ss,strlen(ss));
file.Write("\r\n",strlen("\r\n"));
}
else
pai1(ss,r,s+1,b);
}
}
void MyPer(CString str, int n, CString pre)
{
for(int i=0; i<str.GetLength(); i++)
{
if( n==str.GetLength()-1 )
{
count++;
message.Format("%ld\t",count);
file.Write(message,message.GetLength());
message=pre + str.GetAt(i);
file.Write(message,strlen(message));
file.Write("\r\n",strlen("\r\n"));
}
else
MyPer(str, n+1, pre+str.GetAt(i));
}
}