1. 程式人生 > >統計1到n出現的1的個數(不能用字串)

統計1到n出現的1的個數(不能用字串)

轉http://blog.chinaunix.net/uid-8615291-id-2456793.html

題目: 實現函式int func(unsigned n),其中n為正整數,返回從1到n(包含1和n)之間出現的1的個數,如func(13)=6,func(9)=1。(注意:不能將整數轉化為字串,劍指offer中的方法不能用 分析: 對於數n,可以把它分成三段,高位段most,當前位cur,低位段least,每一段分別為一個整數。對於一個有digit位的數,假設當前位是左數第i位,則設一個臨時變數tmp為10的digit-i次方,即比least多一位的最小整數。如數123456,為6位數,digit=6,設當前為左起第3位,則i=3,most=12,cur=3,least=456,tmp=1000。 如果當前位大於1,則從1到n間出現在當前位出現的1的個數是most*tmp+tmp;如果等於1,則是most*tmp+least+1;如果小於,則為most*tmp。
實現:

int func(unsigned n)
{
    int count = 0;
    int digit = (int)log10(n) + 1;
    int most, cur, least, tmp;
    int i;

    for (i=0; i<digit; ++i)
    {
        tmp = (int)pow(10, digit-i-1);
        most = n / tmp / 10;
        cur = (/ tmp) % 10;
        least = n % tmp;

        count += most *

 tmp;
        if (cur > 1)
        {
            count += tmp;
        }
        else if (cur == 1)
        {
            count += least + 1;
        }
    }

    return count;
}