如果要直接求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;
}
沒有留言:
張貼留言