数学
已知五个互不相同的正整数之和为23,且从这五个数中挑选若干个加起来可以表示从1到23之内的全部自然数。问这五个数是什么?
[解决办法]
#include <iostream>
using namespace std;
chek_num(int a, int b, int c, int d, int e)
{
int num = 23, tmp;
int data[5];
data[0] = a;
data[1] = b;
data[2] = c;
data[3] = d;
data[4] = e;
for(; num > 0; num--)
{
// 不会了 :(
}
}
int main()
{
int a,b,c,d,e;
a=1;
for( b=a+1; b <23; b++)
for(c=b+1; c <23; c++)
for(d=c+1; d <23;d++)
for(e=d+1; e <23; e++)
{
if( (a+b+c+d+e) == 23)
{
//if check_num(a,b,c,d,e)
cout < <a < < ", " < <b < < ", " < <c < < ", " < <d < < ", " < <e < <endl;
}
}
}
5个数, 穷举太麻烦 :(
[解决办法]
可以用穷举法分解23,然后判断所分解的五个数是否可以表示1到23 之间的全部整数。
#include <stdio.h>
int main()
{
int a,b,c,d,e,i,j,k,l,m,x,count=0,f=0; /*f:分解的5个数可以表示出1~23的标记*/
printf( "There are following possble result:\n ");
for(a=1;a <=23;a++) /*将23分解为a,b,c,d,e五个数*/
for(b=1+a;b <=23-a;b++)
for(c=1+b;c <=23-a-b;c++)
for(d=1+c;d <=23-a-b-c;d++)
{
f=1;
if((e=23-a-b-c-d)> d)
for(f=0,x=1;x <24&&!f;x++) /*判断5个数可否表示1~23*/
for(f=1,i=0;i <2&&f;i++) /*穷举5个数的全部取舍*/
for(j=0;j <2&&f;j++)
for(k=0;k <2&&f;k++)
for(l=0;l <2&&f;l++)
for(m=0;m <2&&f;m++)
if(x==a*i+b*j+c*k+d*l+e*m) f=0;
if(!f) printf( "[%d]: %d %d %d %d %d\n ",++count,a,b,c,d,e);
}
}
[解决办法]
首先是逻辑分析,然后再写代码。
逻辑分析:第一个数一定是1;第二个数一定是2。(按大小顺序排,不懂的去死)
第三个数分两种情况,3或4。我们设第四个数为X,第五个数为Y。
3的情况:1,2,3,7,14。这是可以表示的最大范围,可以表示到27。
判断条件 X+Y> =(23-1-2-3)&&Y-X <=(14-7)&&X <=7,然后写程序根据条件枚举。
4的情况:1,2,4,8,16。这是可以表示的最大范围,可以表示到31。
判断条件 X+Y> =(23-1-2-4)&&Y-X <=(16-8)&&X <=8,然后写程序根据条件枚举。
[解决办法]
编一个程序出来才素王道!!!