码迷,mamicode.com
首页 > 其他好文 > 详细

递归推导——猜年龄

时间:2017-05-06 19:13:39      阅读:280      评论:0      收藏:0      [点我收藏+]

标签:break   范围   次方   pre   code   判断   int   .com   分数   

一、问题描述

班里转来了一位新同学,他在介绍自己年龄的时候说:“我的年龄的平方是一个三位数,立方是一个四位数,四次方是一个六位数。三次方和四次方正好将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;
}

四、运行结果

技术分享

 

递归推导——猜年龄

标签:break   范围   次方   pre   code   判断   int   .com   分数   

原文地址:http://www.cnblogs.com/IronLavender/p/6817450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!