2011年6月22日 星期三

ACM 11038 How many 0's?

如果要直接求n~m中間有幾個0,這樣太複雜了,要換個角度想,和10994 Simple Addition差不多

假設f(x, y)就是x~y中間有幾個0要寫,那麼你會發現其實:
f(n, m) = f(0, m) - f(0, n-1)

所以現在問題就變成怎麼求f(0, x)了
假設現在m=75643:
在第一位的0總共有7564+1個 (可以想想看為什麼)
在第二位的0總共有756 * 10個
在第三位的0總共有75 * 100個...以此類推
說到這裡各位大概都知道怎麼求了吧? 但是還有一個問題,那就是當位數=0的時候要怎麼辦?
你要先看懂上面這個例子,你才會懂下面在說什麼

以75043為例:
在第一位的0總共有7504+1個
在第二位的0總共有750 * 10個
在第三位的0總共有75 * 100個...... 錯!!
在第三位的0並非這麼簡單,而是75 * 100 - (99-43)
為什麼要扣掉(99-43)呢?因為75*100會多算到75044~75099,所以必須做修正

了解這些以後,只要自己再多寫幾個例子 ,想法一定很快就會浮現
還有要注意n=0, m=0這組測資


#include <stdio.h>

long long cal(long long num)
{
    long long tmp, c, ten;
   
    tmp = num;
    c = 1 + tmp/10;
    tmp /= 10;
    ten = 10;
    while (tmp >= 10)
    {
        c = c + (tmp/10) * ten;
        if (tmp%10 == 0)
            c = c - (ten-1-num%ten);
        ten *= 10;
        tmp /= 10;
    }
   
    return c;
}

int main(void)
{
    long long n, m, c1, c2;
   
    while (scanf("%lld%lld", &n, &m) == 2 && m >= 0)
    {
        if (n == 0)
            c1 = 0;
        else
            c1 = cal(n-1);
        c2 = cal(m);
       
        printf("%lld\n", c2-c1);       
    }
   
    return 0;
}

沒有留言:

張貼留言