65,210
社区成员
发帖
与我相关
我的任务
分享#include <stdio.h>
#include <string.h>
int main()
{
int a,b,c,d,e;
for(a=1;a <=6;a++) // [42-(1+2+3+4)]/5=6.4 取 6
for(b=a+1;b <=8;b++) // [(42-1)-(1+2+3)]/4=8.75 取 8
for(c=b+1;c <=12;c++) // [(42-1-2)-(1+2)]/3=12 取 12
for(d=c+1;d <=14;d++) // [(42-1-2-3)-1]/2=17.5 先判断下一行代码--然后,此行取 (15-1)=14
for(e=d+1;e <=15;e++) // [(42-1-2-3-4)-0]/1=32 取最大数 15
if(a+b+c+d+e==42)
printf("%d %d %d %d %d\n",a,b,c,d,e); // 共137个
return 0;
}
#include <iostream>
using namespace std;
const int m = 15;
const int n = 5;
bool print(int, int, int *, int *);
int main()
{
int *s = new int[m];
for(int i = 0; i < m; i++)
s[i] = i + 1; //初始化1-15
int *rhs = new int[n];
for(int j = 0; j < n; j++)
rhs[j] = s[j]; //提取前5个元素
while(print(m, n, rhs, s));
delete rhs, s;
return 0;
}
bool print(int m, int n, int *rhs, int *res)
{
int flag = 0;
int sum = 0;
for(int i = 0; i < n; i++)
sum += rhs[i]; //计算前5项和是否为42
if(sum == 42)
{
///////////////输出/////////////////
for(int i = 0; i < n; i++)
cout << rhs[i] << '\t';
cout << endl;
}
for(int k = 0; k < n; k++)
if(rhs[k] == res[m - (n - k)])
///////////////////////////////////
//当有第K位元素到他理论上最后的位置
//如:1234,提取3个元素排列,元素2的理论最大位置在初始3的位置
//////////////////////////////////
{
flag = k;
if(k == 0) //如果是最高位,表明所有组合遍历完毕,推出主函数的循环
return 0;
else
for(int y1 = 0; y1 < m; y1++) //否则将理论上第K位向后移一位,后面N-K位同理后移
if(res[y1] == rhs[k - 1])
{
rhs[k - 1] = res[y1 + 1];
break;
}
break;
}
if(flag)
{
int y2;
for(y2 = 0; y2 < m; y2++)
if(res[y2] == rhs[flag - 1])
break;
for(int l = y2 + 1; flag < n; l++, flag++)
rhs[flag] = res[l];
flag = 0;
}
else //没有到理论上的最高位则只需要将最后一个元素移位
{
for(int p = 0; p < m; p++)
if(res[p] == rhs[n - 1])
{
rhs[n - 1] = res[p + 1];
break;
}
}
return 1;
}