題目描述:
定義乙個函式f(x)表示x這個數用十進位制寫出各個數字的數字之和,比如:f(123) = 1 + 2 + 3 = 6;定義乙個函式g(x)表示這個數用二進位制寫出各個位數上的數字之和,比如:123用二進位制表示為1111011,那麼g(1111011) = 1 + 1 + 1 + 1 + 0 + 1 + 1 = 6。若有乙個數x有f(x) = g(x),則說明這個數是幸運數。若給定乙個範圍n,求小於等於n的幸運數有多少個。
輸入:第一行乙個整數t(t<=10000)表示資料組數,每組資料輸入乙個數n(n <= 100000)。
輸出:每組資料輸出一行,小於等於n的幸運數個數。
樣例輸入:
3 1
5 21
樣例輸出:
1 1
3 我寫的程式如下:
#include
using
namespace
std;
int f(int n)
return sum;
}int g(int n)
return sum;
}int main(void)
cout
<< cnt << endl;}}
return
0;}
可是將這種暴力做法上傳上去發現,用例乙個都沒跑出來,執行超時。
下來之後,上網查還有沒有更好的方法,看到網友的討論說這樣暴力做法重複的運算太多了,如果將運算後的結果儲存下來,就大大節省了時間,說的好有道理。演算法修改為先一口氣算完1~100000所有的數的幸運數,之後每次輸入乙個數,直接查詢陣列即可獲得答案。演算法修改如下:
#include
#include
using
namespace
std;
int f(int n)
return sum;
}int g(int n)
return sum;
}int main(void)
else
}int t;
while (cin >> t)
}return
0;}
定義的乙個ans陣列,用來存放1~100000所有數字從1到該數字的幸運數個數,之後直接從ans陣列中取出答案。邏輯是:若當前數字是幸運數,那它前邊的總幸運數加1,若當前數字不是幸運數,那當前幸運數個數與它前乙個數字的幸運數個數相等。 京東筆試題 幸運數
小明同學學習了不同的進製之後,拿起了一些數字做起了遊戲。小明同學知道,在日常生活中我們最常用的是十進位制數,而在計算機中,二進位制數也很常用。現在對於乙個數字x,小明同學定義出了兩個函式f x 和g x f x 表示把x這個數用十進位制寫出後各個數字上的數字之和。如f 123 1 2 3 6。g x...
歷屆試題 幸運數
問題描述 幸運數是波蘭數學家烏拉姆命名的。它採用與生成素數類似的 篩法 生成 首先從1開始寫出自然數1,2,3,4,5,6,1 就是第乙個幸運數。我們從2這個數開始。把所有序號能被2整除的項刪除,變為 1 3 5 7 9 把它們縮緊,重新記序,為 1 3 5 7 9 這時,3為第2個幸運數,然後把所...
歷屆試題 幸運數
歷屆試題 幸運數 時間限制 1.0s 記憶體限制 256.0mb 錦囊1 使用堆來維護。錦囊2 從左到右掃瞄,用一下堆來處理,堆的每項記錄下要刪的倍數和當前刪到的值,以當前刪到的值建小根堆。每次取出乙個加上一次倍數再放回去。列舉每乙個數,如果這個數被跳過了就列舉下乙個,如果沒被跳過就找到了乙個幸運數...