我們稱乙個十進位制正整數是幸運數當且僅當它只由數字4和7構成,現在給出乙個整數n,你需要計算有多少個不大於n的執行數。由於答案可能非常大,你只需要輸出答案除於10^9 + 7後的餘數。
第一行包含乙個數n。1≤n≤10^1000000
輸出對應的答案。
125
21857711
6 254
輸入使用字串str來儲存。使用遞迴來寫,先寫出遞迴表示式。
每次考慮最高位與7和4的大小關係,當當前最高位大於7,則後面可以選擇7或者4,即有2^n個數,如果最高位為0次高位部位0時,可以有2^(n - 1)個幸運數;當當前最高位和次高位都為0,有2^(n - 2)個幸運數,以此類推。故f(n) = 2^(n + 1) - 1 str[n] > 『7』;
當最高位等於7時,如果最高位選7,則有f(n - 1)個幸運數,如果最高位選4,有2^(n - 1)個執行數,當最高位為0且次高位不為0時,有2^(n - 1)個執行數,當最高位為0且次高位也為0,但次次高位不為0時,有2^(n - 2)個幸運數,以此類推。f(n) = f(n - 1) + 3 * ^(n - 1);
然後依次考慮最高位str[n] < 7 && str[n] > 4,str[n] == 4,str[n] < 4的情況。
由於
#include
#include
using
namespace
std;
#define mod (long)pow(10,9) + 7
string str;
int len;
//求解執行數的個數
int lucky(int num)
if (str[start] > '7')
return
pow(2, num + 1) - 1;
else
if (str[start] == '7')
return
3 * pow(2, num - 1) - 1 + lucky(num - 1);
else
if (str[start] < '7' && str[start] > '4')
return
3 * pow(2, num - 1) - 1;
else
if (str[start] == '4')
return
pow(2, num) - 1 + lucky(num - 1);
else
return
pow(2,num) - 1;
}int main()
return
0;}
使用代換法,明顯可以看出,是乙個等差數列,故時間複雜度為o(n),其中n為輸入字串的長度,即為輸入數的位數。 京東筆試題 幸運數
小明同學學習了不同的進製之後,拿起了一些數字做起了遊戲。小明同學知道,在日常生活中我們最常用的是十進位制數,而在計算機中,二進位制數也很常用。現在對於乙個數字x,小明同學定義出了兩個函式f x 和g x f x 表示把x這個數用十進位制寫出後各個數字上的數字之和。如f 123 1 2 3 6。g x...
網易筆試程式設計題 幸運的袋子
題目描述 乙個袋子裡面有n個球,每個球上面都有乙個號碼 擁有相同號碼的球是無區別的 如果乙個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。例如 如果袋子裡面的球的號碼是,這個袋子就是幸運的,因為1 1 2 3 1 1 2 3 你可以適當從袋子裡移除一些球 可以移除0個,但是別移除完 要使...
華為筆試程式設計1
請在乙個字串中找出連續最長的數字串。具體描述如下圖 演算法思想 這個題目比較簡單,可以迴圈遍歷一次,判斷當前字元是否為數字,如果是則記錄當前長度加1,否則,判斷當前長度是否大於等於最大長度,如果是,則更新最大長度和數字的起始位置 為了能將最大長度的連續數字輸出,故作此記錄 並將當前長度置為0,重新統...