第K個幸運數

2021-07-22 11:17:01 字數 1476 閱讀 6676

4和7是兩個幸運數字,我們定義,十進位制表示中,每一位只有4和7兩個數的正整數都是幸運數字。前幾個幸運數字為:4,7,44,47,74,77,444,447……現在輸入乙個數字k,輸出第k個幸運數。

第一行乙個數字t(t<=1000)表示測試資料的組數。對於每組測試資料,輸出乙個數k(1<=k<=10^18)

每組資料輸出一行 ,第k個幸運數。 3

5100

1000000000

74 744747

77477744774747744747444444447

首先是需要知道這個幸運數字的構造的規律,只有1位的時候,是4,7;有2位的時候,是44,47,74,77;有3位的時候,是444,447,474,477,744,747,774,777;看了這裡,我們就能夠看到這個數字的構造規律了,我們把4當做二進位制中的0,7當做二進位制中1,則1位的時候就是0,1;2位的時候就是00,01,10,11;3位的時候就是,000,001,010,011,100,101,110,111,依次類推……

當1位的時候,有兩個幸運數;2位的時候有2^2個幸運數,3位的時候有2^3個幸運數,……n位的時候含有2^n個幸運數字;我們知道第1,2大的幸運數字是1位,第3,4,5,6的幸運數字是2位,第7,8,9,10,11,12,13,14大的幸運數字是3位,所以知道第k大的數字是(long long)log2(k+1)位;

我們知道第k大的數字是(long long)log2(k+1)位,那麼(long long)log2(k+1)-1位可以表示的數字一共有(等比數列的前n項和)(long long)pow(2,(long long)log2(k+1))-2;所以(long long)log2(k+1)位只需要表示的數字就是n=k-(long long)pow(2,(long long)log2(k+1))-2-1(最後要減1);在把n轉換成二進位制,如果這bit數字是0對應於4,bit是1對應於7;

例:第100大的數字,先求(long long)log2(100+1)等於6,那麼前面有1位,2位,3位,4位,5位的,一共有2+2^2+2^3+2^4+2^5=2^6-2=62個,則6位的應該是100-62-1=37,再把37換成6位的二進位制,是100101,所以第100大的數字就是744747

#include#include#includeusing namespace std;

long long bitnumber(long long n)

long long prenumber(long long bitnumber)

void result(long long num)

int k = res.size() - 1;

while (temn)

temn >> = 1;

k--;

} for (int i = 0; i < res.size(); i++)

cout << endl;

}int main()

return 0;

}

第K個幸運數字(4 7)

題目 4和7是兩個幸運數字,我們定義,十進位制表示中,每一位只有4和7兩個數的正整數都是幸運數字,前幾個幸運數字為 4,7,44,47,74,77,444,447 輸出第k個數字。思路是 將4換成0,7換成1,那麼 4,7,44,47,74,77,444,447.變成了 0,1,00,01,10,1...

尋找幸運數

4和7是幸運數字,由它們所組成的數也是幸運數字。例如 44,47,474,7447等等。這一系列幸運數由小到大構成了幸運數列。現在,需要設計乙個演算法找出第n個幸運數是多少。我們可以將幸運數列分組 4,7 44,47,74,77 444,447,474,477,744,747,774,777 可以看...

尋找幸運數

今天刷題時,遇到了一道題,我覺得還挺有意思的,自己實現了一下,看了下大佬們的答案,實現如下。首先先來看一下什麼是幸運數 我們一般用的數是十進位制,但是機器只識別二進位制,當乙個整數的十進位制數的每一位,加起來等於它的二進位制的每一位加起來的和。舉個例子吧,123的二進位制表示為1111011,所以二...