CSDN上最近常常问到这样上面的问题,例如,求所有和为10的组合(组合中的数皆为自然数,且各不相同),则输出:
1+2+3+4
1+2+7
1+3+6
1+4+5
1+9
2+3+5
2+8
3+7
4+6
今天又有人问,回来想了想,递归的想起来头疼,写了一个非递归的方法,初步测试似乎没有错误,发上来请大家帮忙改进改进^^,也可帮忙提供一些更好的方法:
private static int Num = 10;
static void Main(string[] args)
{
List<int> l = new List<int>();
l.Add(0);
int loopCount = 0;
int outputCount = 0;
int lastRemove = 0;
while (true)
{
if (Sum(l) < Num)
{
if (lastRemove == 0)
{
l.Add(l[l.Count - 1] + 1);
}
else
{
l.Add(lastRemove + 1);
lastRemove = 0;
}
}
if (Sum(l) == Num)
{
Console.WriteLine(Output(l));
outputCount++;
l.RemoveAt(l.Count - 1);
lastRemove = l[l.Count - 1];//
l.RemoveAt(l.Count - 1);
}
if (Sum(l) > Num)
{
l.RemoveAt(l.Count - 1);
l.RemoveAt(l.Count - 1);
if (Sum(l) > 0)
{
int x = Num - Sum(l);
Console.WriteLine(Output(l) + "+" + x.ToString());
outputCount++;
}
else
{
break;
}
lastRemove = l[l.Count - 1];
l.RemoveAt(l.Count - 1);
}
loopCount++;
}
Console.WriteLine("loop count:"+loopCount);
Console.WriteLine("output count:" + outputCount);
Console.Read();
}
static int Sum(List<int> l)
{
int sum = 0;
for (int i = 0; i < l.Count; i++)
{
sum += l[i];
}
return sum;
}
static string Output(List<int> l)
{
string output="";
for (int i = 1; i < l.Count; i++)
{
output += l[i].ToString() + "+";
}
return output.Substring(0, output.Length - 1);
}