程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c++-這個題老是超時怎麼辦啊!想不到什麼高效的方法了!

c++-這個題老是超時怎麼辦啊!想不到什麼高效的方法了!

編輯:編程綜合問答
這個題老是超時怎麼辦啊!想不到什麼高效的方法了!

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的時候也可以優化一下,一個數如果最後是快樂數,那麼對它進行的每一步“求每位平方和”的值都是快樂數。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved