该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
/*---------------------------------
这里说一下我的算法原理:
1.定义一个n进制的数(每个数位用vector保存)
2.使用穷举列出1到n的n-1次方减1
(因为最大的结果是11...11(n个1),n个1相加等于n)
3.把每个数位上的数相加,如果结果等于n则输出vector
PS:如果数太大的话..结果你懂的!!
----------------------------------*/
#include "stdafx.h"
#include
#include
using namespace std;
//输出合条件的vector
void output(vector::iterator biter, vector::iterator eiter)
{
cout << *biter;
++biter;
while (biter != eiter)
{
if(*biter != 0)
{
cout << "+" << *biter;
}
++biter;
}
cout << endl;
}
//检测vector 里元素的和是否等于n
bool checksum(vector::iterator biter, vector::iterator eiter,int n)
{
int sum = 0;
while (biter != eiter)
{
sum += *biter;
++biter;
}
if (sum == n)
return 1;
else
return 0;
}
//检测vector里的元素,如果有元素等于n则这个元素设成1,下一个元素加1
void checkitem(vector::iterator biter, vector::iterator eiter,int n)
{
vector::iterator temiter;
while (biter != eiter)
{
if(*biter == n)
{
*biter = 1;
temiter = biter + 1;
if (temiter != eiter)
*temiter += 1;
else break;
}
++biter;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
cout << "Enter an integral :";
int n;
cin >> n;
vector vec(n,0); //初始化n进制数,每个数位为0
vector::iterator iter = vec.begin();
vector::iterator biter = vec.begin();
vector::iterator eiter = vec.end();
unsigned int time = 1; //n进制数从1加到n的n-1次方
for (int k = 1; k != n - 1; ++k)
{
time *= n;
}
for (unsigned int j = 0; j != time; ++j)
{
for (int x = 0; x != n; ++x)
{
*iter += 1;
checkitem(biter, eiter, n);
if(checksum(biter, eiter, n))
output(biter, eiter);
}
}
system("PAUSE");
return 0;
}
/*------------------------------------
结果:
Enter an integral :4 3+1 2+2 1+3 2+1+1 1+2+1 1+1+2 1+1+1+1 请按任意键继续. . .
-------------------------------------*/