[美團筆試算法題] 統計位數

題目

統計位數

  • 題目描述:求數字n以內的正整數有多少位數字,不統計前導零。例如n=13時,13以內的正整數有12345678910111213,一共17位,則輸出17
  • 輸入:

    • 第一行一個數 T (T<=100),表述數據組數。
    • 對於每組數據,第一行1個整數n,(1<=n<=10^9)
  • 輸出:

    • 對於每組輸出,輸出一行,表示數字位數和。
  • 樣例輸入:

2
13
4
  • 樣例輸出:
17
4

解題思路

  1. 沒有思路時,歸納:(f(n) 表示n的統計位數)
    • 如果n9 ,則很簡單,位數和就是n: f(n)=n
    • 如果n[10,99] ,位數和爲 (n9)×2+9 : f(n)=(n9)×2+f(9)
    • 如果n[100,999] ,位數和爲(n99)×3+(9910)×2+9 : f(n)=(n99)×3+f(99)
  2. 規律基本出來了,
    f(n)=(n10K1+1)K+f(10K11) , if 10K1<n10K,that is K=floor(log10n)

  3. 需要注意的點

    • 題中給出了n的限制:1n109

代碼

  1. 非遞歸
#include  <iostream> 
using namespace std;

int main()
{
    int a, b, T;
    long int tab[10]={0, 9, 9+90*2, 9+90*2+900*3, 9+90*2+900*3+9000*4, 9+90*2+900*3+9000*4+90000*5,
               9+90*2+900*3+9000*4+90000*5+900000*6, 9+90*2+900*3+9000*4+90000*5+900000*6+9000000*7,
               9+90*2+900*3+9000*4+90000*5+900000*6+9000000*7+90000000*8,
        9+90*2+900*3+9000*4+90000l*5+900000*6+9000000*7+90000000*8+900000000*9l 
    };//9l, the 'l' is important
    long int tab1[10]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
    cin>>T;
    for(int i=0;i<T;i++)
    {
        cin>>a;
        int K=9;
        while(a<tab1[K])
        {
            cout<<tab[K]<<endl;  //for debug
            K--;    
        }
        cout<<tab[K]+(a-tab1[K]+1)*(K+1)<<endl;

    }
    return 0;
}
  1. 遞歸
#include  <iostream> 
#include  <cmath>
using namespace std;

unsigned long int my_pow_10(unsigned int k)
{
    unsigned long int tab[10]={1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
    if(k<=9)
    {
        return tab[k];
    }
    else  //error
    {
        return 0;
    }
}

unsigned long int digital_num(unsigned int n, unsigned int K)
{
    if(1 == K)
    {
        return n;
    }
    else
    {
        return (n-my_pow_10(K-1)+1)*K+digital_num(my_pow_10(K-1)-1, K-1);
    }
}
int main()
{
    int n, T;

    cin>>T;
    for(int i=0;i<T;i++)
    {
        cin>>n;
        unsigned int K = (unsigned int)(log(n));
        cout<<digital_num(n, K)<<endl;

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