遞歸推導——猜年齡
阿新 • • 發佈:2017-05-06
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; }
四、運行結果
遞歸推導——猜年齡