2013年蓝桥杯 猜年龄

     猜年龄

 美国数学家维纳(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);  
                      
            }  
        }  
    }  
}  





已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页