和数能表示1-23的五个整数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];
}
}