Advertisement

蓝桥杯真题---猜年龄

阅读量:

题目

美国数学家诺伯特·维纳(N.Wiener)展现出超常的智力,在小学一年级时便已显露出过人的天分并提前进入大学就读。他在上世纪三十年代受邀访问中国清华大学并开展学术交流活动。其中一次访问期间,在一个重要的国际会议上首次露面时因年轻外貌而引起众人注目。随后一位同行学者询问他的年龄时他表示:“我的立方是一个四位数而我的四次方是一个六位数而且这十个数字恰好涵盖了从零到九的所有数字每个仅出现了一次。”请推算一下当时这位著名数学家到底有多少岁呢?

在解决该问题时,在解决该问题时,在解决该问题时,在解决该问题时,在解决该问题时,在解决该问题时,在解决该问题时,在解决问题的过程中,在解决问题的过程中,在解决问题的过程中,在解决问题的过程中,在解决问题的过程中,在解决问题的过程中

在解决问题的过程中:年龄的三次方结果是一个四位数

在解决问题的过程中:年龄的三次方结果是一个四位数

由此可知扫描范围从11开始

随后通过简单的定性方法筛选出符合条件的数值,并将每个数字拆分为单独的元素放入数组中。对这个数组进行逐一检查以计算标志位:其中仅出现一次的位置标记为1。检查所有位置后得到的结果为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;
    }

全部评论 (0)

还没有任何评论哟~