首先,感谢大家对问题的关注,对本人的支持!
特别是田林九村,非常辛苦,花了很长的时间,写出了代码。本人致以衷心的感谢!
在这里,我觉得,这和取球还是有一定的区别的,取球的代码的可以写出来。但这里是:
1:分组:假设球有4个,假设分成2组,也就是分2次取出,要全部取出,如1:234/2:134/13:24等等,也就是说,我分成2次取,每次取得球的个数可以不定,可以1、2、3、4个。
当然也可以分成1、3、4组(次)等等。
而不是一次取2个,分成几次取,全部取尽,如同(4个球,取2个的取法):
4:3/4:2/4:1/3:2/3:1/2:1
要说明的是:球是有编号的,也就是1号球与4号球是2个不同球,只是组合是无序的,41==14,1 != 4。
同样的道理,如果分成3次取,是:1:2:3/1:3:4等等。
“努力的学习者”提出一个插入分融符的思路,倒是可以考虑的。
在此,再次感谢大家对本人的支持!
//===================================================
问题已经解决,原理是“插入法”
细想起来,还是跟取球有所区别,代码如下:
void __fastcall TForm1::CodeNum(AnsiString S) { AnsiString sStr; int x,i,j,m,i_count=0; if(S.Length() < 3 || S.Length() %3 !=0) return; for(x=1;x<S.Length()/3;x++){//分成几组 Memo1->Lines->Add("第"+IntToStr(x)+"种方法:"); for(i=1;i<S.Length() ;i+=3){//字符串长度 sStr=S.SubString(i,S.Length()-i+1) + S.SubString(1,i-1); //将编码对调ABCD--BCDA... m=0; for(j=x;j<S.Length()/3 ;j++){//分别插入 m++; sStr.Insert(":",j*3+m); Memo1->Lines->Add(sStr);//结果 i_count++; }//for(j=x;j<=S.Length()/3 ;j++){//分别插入 }//for(i=1;i<S.Length() ;i+=3){//字符串长度 }//for(x=1;x<S.Length() /3-1;x++){//分成几组 Memo1->Lines->Add("共有"+IntToStr(i_count)+"种方法。"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Memo1->Text =""; CodeNum("000112233444"); } //--------------------------------------------------------------------------- The Result is: 第1种方法: 000:111222333444 000:111:222333444 000:111:222:333444 000:111:222:333:444 111:222333444000 111:222:333444000 111:222:333:444000 111:222:333:444:000 222:333444000111 222:333:444000111 222:333:444:000111 222:333:444:000:111 333:444000111222 333:444:000111222 333:444:000:111222 333:444:000:111:222 444:000111222333 444:000:111222333 444:000:111:222333 444:000:111:222:333 第2种方法: 000111:222333444 000111:222:333444 000111:222:333:444 111222:333444000 111222:333:444000 111222:333:444:000 222333:444000111 222333:444:000111 222333:444:000:111 333444:000111222 333444:000:111222 333444:000:111:222 444000:111222333 444000:111:222333 444000:111:222:333 第3种方法: 000111222:333444 000111222:333:444 111222333:444000 111222333:444:000 222333444:000111 222333444:000:111 333444000:111222 333444000:111:222 444000111:222333 444000111:222:333 第4种方法: 000111222333:444 111222333444:000 222333444000:111 333444000111:222 444000111222:333 共有50种方法。
谢谢大家!
//=================================================
有一个字符串形如:111222333...NNN,每三个数字为一个位,现在要进行分组排列,规则如下:
分组:以位为单位,求出所有分组的可能性,这样可分成N组。 其中,编码为无序,
如N=3,
分成一组:111:222:333 (等同于111:333:111 或333:111:222)
分成二组,情况如下:
111:222333;
111222:333
111333:222
(其中111:222333 ==111:333222;222333:111==111:222333)
分成三组是:111:222:333。(其中111:222:333==333:222:111等等)
当N>3时,就复杂了,如N=4
可分成1-4组,如分成三组:
111:222:333444
111:333:222444
111:444:222333
111222:333:444
111333:222:444
111444:222:333
222:111333:444
......
现在,请教,这样的算法用代码该怎么写呢?
谢谢大家!
这是比较简单的排列组合吧,N个球里面分别取1~N个球,分别有几种取法
static void Main(string[] args) { int N = 4; for (int i = 1; i < N + 1; i++) { Console.WriteLine(N + "个球里面取" + i + "个球的排序组合为:"); StringBuilder sb = new StringBuilder(); for (int j = 1; j < N + 2 - i; j++) { string lessOne = j.ToString(); StringBuilder temp = new StringBuilder(); temp.Append(j); if (temp.Length < i) { while (temp.Length < i) { for (int k = j + 1; k < N + 1; k++) { temp.Append(k); if (temp.Length < i) lessOne = temp.ToString(); else { sb.Append(temp).Append(","); if (k < N) { temp = new StringBuilder(); temp.Append(lessOne); } } } } } else { sb.Append(temp).Append(","); } } Console.WriteLine(sb.Remove(sb.Length - 1, 1)); } }
这段代码花了1个小时,还是有点问题,你改进一下吧,改造为递归比较好
数学问题。
1-n,n个球
规则:总共n个球,次数不限,每一次的个数不限,取完为止。
问有多少个取法 呗。
代码好些,就是这个事情怎么理解
参考:http://zhidao.baidu.com/question/274911796.html&__bd_tkn__
=689153252f3eda6b5307bc34a9be3ef9991e8ba08078338d51fed8133ea5c69d362ad36
bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157a5bf93b9c66aef1580f03de
0125270aa640be7b4d06ef000c5ec3f8a63f477e742d3128b8670b374fc2ddafec7dfaacc
这是一个在排列组合里属于组合的问题,球没有编号就都是一样的,所以只涉及到取的个数问题,所以只要考虑每次取的个数,可以把这个问题引申为在这些球之间放隔断,这样就考虑隔断的个数和隔断的方法。
这是个很简单的排列组合的问题,只要把树状图画出来,代码基本上就出来了。。。。。
假如有5个球,把这5个球进行组合,从其中不重复的取出4个球,代码如下:
private void button1_Click(object sender, EventArgs e)
{
ArrayList al = new ArrayList();
string str = "abcde";
int i = 0;
int a = 0;
int b = 0;
int c = 0;
for (i = 0; i < str.Length; i++)//第1个数取值
{
for (a = i + 1; a < str.Length; a++)//第2个数取值
{
for (b = a + 1; b < str.Length; b++)//第3个数取值
{
for (c = b + 1; c < str.Length; c++)//第4个数取值
{
al.Add(str[i].ToString() + str[a].ToString() + str[b].ToString() + str[c].ToString());
}
}
}
}
}
经测试,没问题,符合你的要求。。。。。希望你成功!