和数能表示1-23的五个整数

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include
#include
#include
#include
#include

using namespace std;

int judge(int a[]);//判断能不能组成1 - 23之间的数
void change(int a[], int b[], int n);//输出整形数组的所有组成样式
void copy(int a[], int b[]);//复制整形数组

void main()
{
int start = clock();//计时开始

int i = 1, j = 2, k = 4, m, n;//因为要组成1 - 23之间的数字则必须要有1,2,4这三个数字....这点可以分析出来
int a[5] = {1, 2, 4, 0, 0};//将这五个数存放在数组里

for(m = 7; m < 10; m++)//下一个数从7开始,当然你也可以从5开始... 但1 + 4 = 5; 2 + 4 = 6; 都有了,我就从7开始了
{
n = 23 - i - j - k - m;//另外一个数则利用减法就可以知道了

if(n == i || n == j || n == k || n == m) //当数字有重复时,continue
continue;

a[3] = m;//将剩下的两个数存放在数组里
a[4] = n;

int t[24] = {0};//定义一个数组判断1 - 23这些数包含在数组里没有,如果有则为1,反之为0

change(a, t, 0);

if(judge(t))//如果是则跳出循环
{
cout<<23<<" = "<break;
}
}

int end = clock();//计时完毕

cout<<"花费"<}

int judge(int a[])
{
int i;

for(i = 1; i < 24; i++)
{
if(a[i] == 0)//如果有一个数没有实现则跳出循环...
break;
}

if(i == 24)//当i == 24的时候循环完毕,也就说明都是1
return 1;

return 0;
}

void change(int a[], int b[], int n)
{
if(n == 4)//当i == 4的时候,递归终止
{
int z, x;

for(z = 0; z < 5; z++)//判断这个数组中的所有子数组的和...
{
int result = 0;

for(x = z; x < 5; x++)
{
result += a[x];

b[result] = 1;//如果存在result,则使数组的该下标所表示的值为1
}
}
}
else
{
int i;

int k[5];

for(i = 0; i <= n; i++)
{
copy(k, a);

int t = a[i];
a[i] = a[n];
a[n] = t;

change(a, b, n + 1);//递归... 将第i个数和第n个数交换位置

copy(a, k);
}
}
}

void copy(int a[], int b[])//复制, 没什么好说的了
{
int i;

for(i = 0; i < 5; i++)
{
a[i] = b[i];
}
}

相关文档
最新文档