Problem Description
給定一個正整數,然後將其每一位數字進行平方求和後形成下一個數,循環往復,直到生成的數在前面已經出現過為止,變換結束。
例如:給定44,2個4的平方求和變成32,3的平方加2的平方等於13,1的平方加3的平方等於10,然後就是1,下面仍然是1,序列變換結束。可簡單描述成:44->32->13->10->1->1。
再例如給定2,其變換序列為:2->4->16->37->58->89->145->42->20->4。
我們規定,給定正整數n,若最後的變換終止於數值1,則稱n為“快樂數”,否則就不是。
現在的任務:給定正整數N,請你計算區間[1..N]之間有多少個“快樂數”。
Input
測試數據有多組,首先輸入測試的組數T (0<T<=20),然後是T組測試數據;每組測試輸入一個正整數N(1 <= N <= 5,000,000).
Output
對於每組測試,請你計算區間[1..N]之間有多少個“快樂數”。
Sample Input
4
1
10
1000
10000
Sample Output
1
3
143
1442
我的想法是
建立一個布爾數組A,長度為502,若A【n】為真則表示n為快樂數。所以真正需要計算的只有502這個范圍內,這個數組A可以提前計算出來,只需要循環502個數就可以
對於任意一個小於五百萬的數a,計算它的“每一位的平方和”的值n,若A【n】為真則a為快樂數。有了數組A那麼再判斷每個數就只需要計算一次了。
計算數組A的時候也可以優化一下,一個數如果最後是快樂數,那麼對它進行的每一步“求每位平方和”的值都是快樂數。