1. 程式人生 > >遞歸推導——猜年齡

遞歸推導——猜年齡

http 一個數 相同 bsp 位數 數字 printf while 如果

一、問題描述

班裏轉來了一位新同學,他在介紹自己年齡的時候說:“我的年齡的平方是一個三位數,立方是一個四位數,四次方是一個六位數。三次方和四次方正好將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; }

四、運行結果

技術分享

遞歸推導——猜年齡