猜神童年龄

题目内容:美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是一个4位数。我年龄的4次方是一个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你编程算出他当时到底有多年轻。

#include<stdio.h>
#include<stdlib.h>
int main()
{
int y,z,c,d,i,m,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,a0=0;
for(y=10;y<=22;y++) //设y为神童的年龄,用递推求出用年龄
{
a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,a0=0; //每一次循环初始化一次。
d=yyyy;
c=y
yy;
z=d
10000+c; //即将六位数和四位数组合成一个十位数,再判断是否相互不等,如果是则y即为神童年龄。
do //将十位数进行数位拆分
{
m=z%10;
z=z/10;
switch(m)
{
case 1:a1++;break;
case 2: a2++;break;
case 3: a3++;break;
case 4: a4++;break;
case 5: a5++;break;
case 6: a6++;break;
case 7: a7++;break;
case 8: a8++;break;
case 9: a9++;break;
case 0: a0++;break;
}
}while(z!=0);
if ((a1== 1)&&(a2== 1)&&(a3== 1)&&(a4== 1)&&(a5== 1)&&(a6== 1)&&(a7== 1)&&(a8== 1)&&(a9== 1)&&(a0==1))
printf(“age=%d\n”,y);
}
return 0;
}

【解题思路】:因为已知年龄的立方是一个4位数字,所以可以推断年龄的范围在10到22之间,因此确定穷举范围为10到22。如果年龄还满足“年龄的4次方是一个6位数”这个条件,则先计算年龄的立方值的每一位数字,从低位到高位分别保存到变量b1,b2,b3,b4中,再计算年龄的4次方值的每一位数字,从低位到高位分别保存到变量a1,a2,a3,a4,a5,a6中。如果上述10个数字互不相同,则必定是包含了从0到9这10个数字并且每个都恰好出现1次,因此只要判断上述10个数字互不相同,即可确定这个年龄值为所求。

猜你喜欢

转载自blog.csdn.net/qq_43535204/article/details/85002673