递归推导——猜年龄
一、问题描述
班里转来了一位新同学,他在介绍自己年龄的时候说:“我的年龄的平方是一个三位数,立方是一个四位数,四次方是一个六位数。三次方和四次方正好将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; }
四、运行结果