幸運數字

鏈接:https://www.nowcoder.com/questionTerminal/69682e8bd0654795955c2e478b988f93?toCommentId=2514642

小雅同學認爲6,8是她的幸運數字,而其他數字均不是,一個幸運數是指在十進制表示下只含有幸運數字的數。給定你一個區間(a,b)a和b之間(其中包括a和b幸)運數的個數。

輸入描述:
輸入兩個整數a和b,a的取值範圍在1和1000000000之間(其中包括1和1000000000),b的取值範圍在a和1000000000之間(其中包括a和1000000000)。

輸出描述:
返回a和b之間的幸運數個數,如果入參不合法,請輸出-1
示例1
輸入
1 10
輸出
2

  • 1.求a到b區間的幸運數,那麼只要分別求出0到a和0到b的幸運數然後作差就可以了
  • 2.因爲範圍是 0到1e10,所以幸運數的數量應該是2e10
  • 3.幸運數可以通過畫一顆二叉樹發現規律,層次遍歷是這樣的,6,8,66,68,86,88,666,668,686,688,866,868,886,888…可以發現對於每個節點,左子樹是×10+6,右子樹是×10+8,然後用數組模擬一個隊列,把所有的值存進去,然後剛好就是從小到大,然後用a和b表示剛好大於或者等於的一個幸運數,然後做差就行
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
#define MAX 1000000000
int lucky[maxn];
int top;
void init();
int main()
{
    init();
    int a,b,ansa=0,ansb=0;
    cin>>a>>b;
    for(int i=0;i<top;++i)
    {
        if(a<lucky[i])
        {
            ansa=i;
            break;
        }
    }
    for(int i=0;i<top;++i)
    {
        if(b<lucky[i])
        {
            ansb=i;
            break;
        }
    }
    //cout<
    if(ansb-ansa>0)
    {
        cout<<ansb-ansa<<endl;
    }else 
    {
        cout<<"-1"<<endl;
    }
    return 0;
}
void init()
{
    int i=0;
    top=2;
    lucky[0]=6;
    lucky[1]=8;
    while(1)
    {
        if(i>512) break;
        lucky[top++]=lucky[i]*10+6;
        lucky[top++]=lucky[i]*10+8;
        i++;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章