2011年6月16日 星期四

ACM 10994 Simple Addition

分析一下你會發現其實這題要求的就是"每個數字從右邊數過來第
一個不為0的數字的總合"

以p = 23, q = 34為例:
23從右邊數過來第一個不為0的數字為3
24為4
.....
.....
30為3
所求即為3+4+...+0+1+2+3+4

了解這個以後也許你心裡有個底了:暴力解
但這樣你會吃TLE,因為數字太大
你還需要有一個更關鍵的觀察:
S(p, q) = S(0, q) - S(0, p-1)
剩下的留給各位去思考


#include <stdio.h>

int main(void)
{
    int i;
    long long p, q, sum1, sum2;
   
    while (scanf("%lld%lld", &p, &q) == 2 && (p >= 0 || q >= 0))
    {
        sum1 = sum2 = 0;
       
        // 求S(0, p-1)
        p--;
        while (p > 0)
        {
            i = 0;
            while (i != p%10)
            {
                i++;
                sum1 += i;
            }
            sum1 = sum1 + 45*(p/10);
            p /= 10;
        }
       
        // 求S(0, q)
        while (q > 0)
        {
            i = 0;
            while (i != q%10)
            {
                i++;
                sum2 += i;
            }
            sum2 = sum2 + 45*(q/10);
            q /= 10;
        }
       
        printf("%lld\n", sum2-sum1);
    }
   
    return 0;
}

沒有留言:

張貼留言