“21天好习惯”第一期-20

猜神童年龄(4分)

题目内容:

美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是一个4位数。我年龄的4次方是一个6位数。这

10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”请你编程算出他当时到底有多年轻。

【解题思路】:因为已知年龄的立方是一个4位数字,所以可以推断年龄的范围在10到22之间,因此确定穷举范围为10到22。如果年龄还满足“年龄的4次方是一个6位数”这个条件,则先计算年龄的立方值的每一位数字,从低位到高位分别保存到变量b1,b2,b3,b4

中,再计算年龄的4次方值的每一位数字,从低位到高位分别保存到变量a1,a2,a3,a4,a5,a6中。如果上述10个数字互不相同,则必定是包含了从0到9这10个数字并且每个都恰好出现1次,因此只要判断上述10个数字互不相同,即可确定这个年龄值为所求。

#include<stdio.h>
int main()
{
    int j,a,flag;
    long x,y;

    for(a=10;a<=22;a++)
    {
        int arr[10]={0};
        x=a*a*a;y=a*a*a*a;
        while(x)
        {
            arr[x%10]++;
            x/=10;
        }
        while(y)
        {
            arr[y%10]++;
            y/=10;
        }
        for(j=0;j<10;j++)
        {
            if(arr[j]!=1)
            {
                flag=1;break;
            }
        }
        if(flag==0)
        {
            printf("age=%d\n",a);break;
        }
        flag=0;
    }
    return 0 ;
}

解题思路

1.根据10个数字互不相同 可以用数组长度来存储 如果互不相同则每一个数字都会被赋值为1 

2.同时要定义一个flag作为if语句的判断条件(具体如代码所示) 如果数组中有某个元素不为1 则跳过打印阶段进入下一个循环

3.在每一个循环过程中都需要把flag重置为0 否则后面会使得flag固定为1 就无法打印

过程中直接以x y 作为了while循环判断条件因为x为0 的时候代表假的 循环就会结束 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值