日期:2014-05-19  浏览次数:20907 次

高手们帮我一下..A+B+C+D+E+F=120的程序
怎么写a+b+c+d+e+f=120呀(120为可变更的值)
求出abcdef所有可行的值..
abcdef的值为1-100之间

比如
            a+b+c+d+e+f=10
            1+2+1+1+1+4=10
            2+2+2+2+1+1=10
            ........
不用多个for来循环
在线等.....


------解决方案--------------------
class Program
{
static void Main(string[] args)
{
Combine(120, 5);
Console.ReadLine();
}
static void Combine(int sum, int numCount)
{
int[] pos = new int[numCount];
for (int i = 0; i < pos.Length; i++)
{
pos[i] = i + 1;
}
int curNum = numCount - 1;
while (pos[0] <= sum - numCount)
{
if (pos[curNum] <= sum - (numCount - curNum))
{
PrintArr(sum, pos);
pos[curNum]++;
}
else
{
curNum--;
if (curNum < 0)
{
break;
}
}
}
}
static void PrintArr(int sum, int[] pos)
{
for (int i = 0; i < pos.Length ; i++)
{

if (i == pos.Length - 1)
{
Console.Write(sum - pos[i]);
Console.WriteLine();
}
else if (i == 0)
{
Console.Write(pos[i] - 0+ "+ ");
}
else
{
Console.Write(pos[i + 1] - pos[i] + "+ ");
}
}
}
}
------解决方案--------------------
给你一个不用for循环的, c++版本,结果(A,B,C,D,E,F,G)是组合的,由于c++打印语句cout比较耗费时间,你可以把结尾为///的语句注释掉,不过这样你就看不到结果了
#include <iostream>
using namespace std;
#define COUNT 6
#define RESULT 120
int save[COUNT+1];
void fun(int nCount,int nStart,int nTotal)
{
if(nCount==1)
{
save[nCount]=nTotal;///
for(int i=COUNT;i> 1;i--)///
cout < <save[i] < < "+ ";///
cout < <save[1] < < "= " < <RESULT < <endl;///
return;
}
for(int i=nStart;i <=nTotal/nCount;i++)
{
save[nCount]=i;///
fun(nCount-1,i,nTotal-i);
}
}
void main()
{
fun(COUNT,1,RESULT);
}
------解决方案--------------------
sorry,上面的程序没有加入 {A,B,C,D,E,F} <100的限制,改下,并加入统计结果数目功能
#include <iostream>
using namespace std;

#define MIN(a,b) (a <b?a:b)
#define COUNT 6
#define RESULT 120
#define MIN_ 1
#define MAX_ 100
int save[COUNT+1];
int nCountResult; //统计得到结果的数目

void fun(int nCount,int nMin,int nMax,int nTotal)
{
if(nCount==1)
{
if(nTotal <=nMax)
{
save[nCount]=nTotal;
for(int i=COUNT;i> 1;i--)
cout < <save[i] < < "+ ";
cout < <save[1] < < "= " < <RESULT < <endl;
nCountResult++;
}