2013年蓝桥杯 猜年龄

来源:互联网 发布:淘宝号一天刷几单安全 编辑:程序博客网 时间:2024/05/16 05:32

     猜年龄

 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。

  一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:
 “我年龄的立方是个4位数。我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”

 请你推算一下,他当时到底有多年轻。

思路点拨:

最常见的是先用/10和%10把各个位上的数取出来,然后判断是否相等,有点麻烦 但着实是一个好办法;

另外可以大致推算他的年龄大概在10~30岁之间(可以自己立方 四次方试试 就知道大概的范围 缩小范围是有好处的 下边在详解!)

参考代码如下:

#include<stdio.h>#include<math.h>#include<string.h>int main(){int m,n,i,a[10],j;for(i=10;i<30;i++){m=pow(i,3); //pow()函数的作用就是计算i的 3次方 n=pow(i,4);memset(a,0,sizeof(a));//memset()函数在前的博客中已经提到 可以参见if(m>=1000 && m<10000 && n>=100000 && n<1000000)//初步限定m为四位数 n为6位数{for(j=0;j<4;j++){   a[m%10]+=1; //因为在我们初始化的时候 a[10]就是为了标记具体位置的 数字 用下表表示是不是存在这个数 标记为1   m/=10;}for(j=0;j<6;j++){a[n%10]+=1;//同上 假如n为345678的话 也就是在下标为 3 4 5 6 7 8的位置是有数字的  也相当于存在了n/=10;}for(j=0;j<10;j++)//因为总共有0 1 2 3 4 5 6 7 8 9 十个数{if (a[j]!=1) break;//此时的情况是 第j个数没有标记为1  即不符合要求if (j==9) printf("%d\n",i);//就是遍历到最后一个未知的时候 也就是成立的情况}}}return 0;}


另外上边提到了 为什么要缩小范围 但对于考试而言我们可以这样:

#include<iostream>#include<string.h>using namespace std;int year;int y1,y2;int main(){for(year=10;year<30;year++){y1 = year*year*year;y2 = year*year*year*year;printf("他的年龄是:%d\n",year);printf("y1:%d\n",y1);    printf("y2:%d\n\n",y2);}return 0;}
运行结果为:(为一部分结果)答案是:18



然后怎么办哪?对于考试而言,想必知道了 根据题意一个一个的检索噻  是不是so easy!比写具体的代码省了好多时间!

网上还有一些大神的代码一并附上 希望大家参考:

public class GuessYear {        /**      * 判断两个数组中的数字是否有相同的      * @param x      * @param y      * @return      */      boolean isEqual(long[] x,long[] y){                    boolean flag = false;          int len = x.length;          int len1 = y.length;                    //判断两个数组间是否有相同的数字          for(int i = 0; i < len; i++){              for(int j = 0; j < len1; j++){                  if(x[i] == y[j])                      flag = true;              }          }          //判断第一个数组内是否有相同的数字          for(int i = 0; i < len; i++){              long tmp = x[i];              for(int j = i+1; j < len; j++){                  if(tmp == x[j])                      flag = true;              }          }          //判断第二个数组内是否有相同的数字          for(int i = 0; i < len1; i++){              long tmp = y[i];              for(int j = i+1; j < len1; j++){                  if(tmp == y[j])                      flag = true;              }          }                    return flag;      }            /**      * 判断某数字是几位数      * @param tmp      * @return      */      boolean isWhatBit(long num,int bit){          int count = 0;                    while(num != 0){              num /= 10;              count++;          }                    if( count == bit) return true;          else              return false;      }      /**      * 将数字分离到数组中      * @param a      * @param x      */      void splitNumber(long num,long []x){          int i = x.length - 1;                    while(num != 0){              x[i--] = num % 10;              num /= 10;          }      }      /**      * 猜年龄      */      void guess(){                    long x[] = new long[4];          long y[] = new long[6];            long row,col;                    row = col = 10;          for(long i = 1; i < row; i++){              for(long j = 0; j < col; j++){                  long tmp = i*10+j;                                          long f = tmp*tmp*tmp;                  long s = f*tmp;                                    if(!isWhatBit(f,4))                      continue;                  if(!isWhatBit(s,6))                      continue;                                    splitNumber(f,x);                  splitNumber(s,y);                                    if(!isEqual(x,y))                      System.out.println(tmp);                                    }          }      }  }  





2 0
原创粉丝点击