您的位置:首页 > 编程语言

三个孩子年龄相乘是36,将三个孩子的年龄从大到小输出的智力编程题

2017-09-19 22:04 489 查看
问题

一普查员问一位女士,“你有多少个孩子,他们多少岁?”女士回答:“我有三个孩子,他们的岁数相乘是36,岁数相加就等于隔离间屋的门牌号码.”普查员立刻走到隔邻,看了一看,回来说:”我还需要多少资料.”女士回答:“我现在很忙,我最大的孩子正在楼上睡觉.”普查员说:”谢谢,我己知道了

问题:那三个孩子的岁数是多少?

思路(引用)

首先考虑将36分解成三个因子相乘,及获取不重复排列。

岁数相加是门牌号,普查员此时是能看到门牌号的,但是此时并不能得到结果,那么说明问题的解,存在于多组和相等的门牌号中。

最大的孩子在睡觉,能得到结果,可得知,上面求得的多组和相等的排列中,排列中有且只有一个最大值。该排列从大到小输出,就是问题的解。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n=36;
int a[20][3];
int flag=0;

int i,j,k,m,l;
int firstIndex=0;
for(i=1; i<=sqrt(n); i++)
{
//这里是第一位数
m=n;
if(n%i==0)
{
a[firstIndex][flag]=i;
m=n/i;
l=m;
}

for(j=i; j<=sqrt(n); j++)
{
//把其他两位数放进来。
if(j<=sqrt(l))
{
if(l%j==0)
{
flag++;
a[firstIndex][flag]=j;
l/=j;
flag++;
a[firstIndex][flag]=l;
firstIndex++;
a[firstIndex][0]=i;
flag=0;
l=m;
}
}
}
}
int sum[20]= {0};
int max=0;
int resultIndex[10];
int resultFlag=0;

for(i=0; i<firstIndex; i++)
{
for(j=0; j<3; j++)
{
sum[i]+=a[i][j];
}
}
//得到sum数组 找到重复的数组。
for(i=0; i<firstIndex; i++)
{

for(j=0; j<firstIndex; j++)
{
if(sum[i]==sum[j]&&i!=j)
{
//我只把第一个留下,反正都会全部遍历,这样得到的结果便不会重复
resultIndex[resultFlag]=i;
resultFlag++;
}
}
}
//找到存在唯一最大值的样本
for(i=0; i<resultFlag; i++)
{
int bRepetition=0;
max=0;
for(k=0; k<3; k++)
{
if(max<a[resultIndex[i]][k])
max=a[resultIndex[i]][k];

}
for(k=0;k<3;k++)
{
if(max==a[resultIndex[i]][k])
bRepetition++;
}
//说明这里就是要输出的解
if(bRepetition==1)
{
//从大到小,冒泡下
for(j=2;j>=1;--j)
{
for(k=1;k<=j;++k)
{
int temp;
if(a[resultIndex[i]][k]>a[resultIndex[i]][k-1])
{
temp=a[resultIndex[i]][k];
a[resultIndex[i]][k]=a[resultIndex[i]][k-1];
a[resultIndex[i]][k-1]=temp;
}
}
}
for(k=0;k<3;k++)
{
printf("%d ",a[resultIndex[i]][k]);
}
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐