组合问题,看看组合的算法。取出来的个数一定是2吗?我一般这么做,如果是N取2的话(伪代码) RESULT[]; //存放所有组合的结果 //这里我们设计RESULT.FIND[X,Y] = RESULT.FIND[Y,X] RESULT.ADD(X, Y) = RESULT.ADD(Y, X)FOR X = 1 TO N FOR Y = 1 TO N { //双重循环必然会有重复 比如:(1, 2)=(2, 1) IF (!RESULT.FIND[X,Y]) RESULT.ADD(X, Y); //如果没有这个组合,就把这个新的组合放入结果集 }具体的算法不难实现
RESULT[]; //存放所有组合的结果
//这里我们设计RESULT.FIND[X,Y] = RESULT.FIND[Y,X] RESULT.ADD(X, Y) = RESULT.ADD(Y, X)FOR X = 1 TO N
FOR Y = 1 TO N
{
//双重循环必然会有重复 比如:(1, 2)=(2, 1)
IF (!RESULT.FIND[X,Y]) RESULT.ADD(X, Y); //如果没有这个组合,就把这个新的组合放入结果集
}具体的算法不难实现
参考这里的一些文章:
http://topic.csdn.net/u/20071124/11/968809b3-12cd-455b-9f07-4c6938fa31fb.html
http://www.dlog.cn/html/diary/showlog.vm?sid=2092&log_id=9597这个pdf详细论述了组合算法,简明扼要,有代码示例
http://www.bxmy.org/article/combination.pdf
private void button1_Click(object sender, EventArgs e)
{
String[] s = { "1", "2", "3"};
ArrayList strSrc = new ArrayList();
foreach (String str in s)
{
strSrc.Add(str);
}
ArrayList strRet = GetData(strSrc,String.Empty);
} private ArrayList GetData(ArrayList strSrc, String strBase)
{
ArrayList alRet = new ArrayList();
int iCount = strSrc.Count;
for (int i = 0; i < iCount; i++)
{
alRet.Add(strBase + (String)strSrc[i]);
if (strSrc.Count > 1)
{
ArrayList alNewSrc = new ArrayList(strSrc);
for (int j = 0; j <= i; j++)
{
alNewSrc.RemoveAt(0);
}
ArrayList alTemp = GetData(alNewSrc, strBase + (String)strSrc[i]);
foreach (object obj in alTemp)
{
alRet.Add(obj);
}
}
}
return alRet;
}
如果有5个数字就是 C51+C52+C53+C54+C55 =(5+5*4/2*1)*2 + 1 = 31吧建议7楼的再看看高中代数