首页 > 代码库 > 递归推导——猜年龄

递归推导——猜年龄

一、问题描述

班里转来了一位新同学,他在介绍自己年龄的时候说:“我的年龄的平方是一个三位数,立方是一个四位数,四次方是一个六位数。三次方和四次方正好将0/1/2/3/4/5/6/7/8/9这10个数字全部覆盖。”,那么,该同学今年多大?

二、算法思想

首先将年龄的大致范围确定下来,因为17的四次方是83521,小于六位数;22的三次方是10648,大于四位数;因此该同学的年龄范围是大于17而小于22。然后将17~22之间的数进行列举,将计算得到的四位数和六位数的每位数字分别存放于数组中,再判断是否有重复或者部分数字未出现,最后将运算出的结果全部输出即可。

 

补充:

我之前的想法是将三次方m的各位数放在一个数组a中,四次方n的各位数放在另一个数组b中,然后两重循环比较这两个数组是否有相同的数字,一旦发现一个相同的数字,则说明本次的年龄x不符合题意,寻找下一个x。但是这个想法是错的,因为没有考虑到三次方m中或四次方n中,它们本身会有相同的数字出现,例如20的四次方是160000。

三、程序代码

#include <stdio.h> 

int main(){
    long m, n, a[10] = {0}, b[10] = {0};
    int x=18, i, j;
    do{
        m = x*x*x; //计算立方,并入数组a中 
        for(i=3; i>=0; i--){
            a[i] = m%10;
            m = m/10;
        }
        
        n = x*x*x*x; //计算四次方,放入数组a中,注意下标 
        for(i=9; i>=4; i--){
            a[i] = n%10;
            n = n/10;
        }
        
        //统计每个数字出现的次数 
        for(i=0; i<10; i++){
            b[a[i]] ++;
        }
        //如果0~9每个数字都只出现一次,那么输出此时的x即为该同学的年龄 
        for(i=0; i<10; i++){
            if(b[i] == 1){
                if(i == 9){
                    printf("\n%The age is %ld\n\n", x);
                }
            }
            else
                break;
        }
        
        x ++;//继续讨论 
    }while(x<22);
    
    return 0;
}

四、运行结果

技术分享

 

递归推导——猜年龄