蓝桥杯真题---猜年龄

本文介绍了一个关于美国数学家维纳的趣事,他在年轻时曾因年龄的立方和四次方的数字特性引发关注。题目中提到,维纳年龄的立方是个4位数,四次方是个6位数,且这10个数字恰好包含了0到9每个数字各一次。通过简单的算法,我们可以推算出他当时的年龄。主要涉及数学和逻辑推理。

题目

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

解决方案:flag标记法
空间复杂度:20
时间复杂度:o(n)
首先对题目进行分析:年龄的立方是4位数,可以确定扫描的下限是11

之后便是通过简单的定性,确定满足条件的数,将数的每一位放进一个数组之中,最后将数组进行遍历,确定flag值,如果只出现一次就是1,数组遍历9次即可,9次都是1的就是满足条件的数.`

#include <stdio.h>

#define false 0
#define ture  1

int flag[10];
int r[10];
/***********************************************************************************
* 函    数:int test(const int *ar)
* 功    能:将r[10]进行遍历,并记录flag值,通过flag值来判断是不是目标值
* 参    数:一维数组指针
* 返 回 值:正确 1 错误0
* 说    明:本函数时间复杂度为20 空间复杂度为20
************************************************************************************/
int test( const int *ar){
    for(int i=0;i<10;i++)
    {
        flag[ar[i]]+=1;
    }
    int i=0;
    for( i=0;i<9;i++)  //对flag进行遍历,如果每次数字都出现了一次,则能遍历到最后一个棋子,i=9
    {
        if(flag[i]!=1)
            break;
    }
    if(i!=9)
        return false;
    else
        return ture;
}
/***********************************************************************************
* 函    数:void main()
* 功    能:主函数
* 参    数:无
* 返 回 值:0
* 说    明:本函数时间复杂度为n
************************************************************************************/
int main()
{
    int i,j,a,b;
    for(i=11;i<100;i++)
    {
        a=i*i*i;
       if( (a/1000)>=1&&(a/10000)==0)//对数字位数进行判断
       {
           b=a*i;
           if((b/100000)>=1&&(b/1000000)==0)//同理
           {
               //将a和b按位存入r[10]中
               for(j=0;j<4;j++)
               {
                   r[j]=a%10;
                   a=a/10;
               }
               for(j=4;j<10;j++)
               {
                   r[j]=b%10;
                   b=b/10;
               }


              if (test(r))//根据返回值判断是否是所求数据
              {
                  printf("%d",i);
                  break;
              }

              else
                  continue;
           }
           else
               continue;

       }
       else
           continue;
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值