ACM复习(51)11159 只有神知道的世界

Description
在天地人三界之中,二次元空间已是家喻户晓。但是,存在于神秘国度的三次元空间却鲜为人知,因为那是只有神知道的世界。
传说中,要进入三次元空间必须通过守门大将的考核。
这是一个很简单的题目。
对于任意一个非负数N,我们定义D(N) 为N上奇数数字的和加上两倍偶数数字的和。举个例子:D(567) = 5 + 6 * 2 + 7 = 24, D(314159) = 3 + 1 + 2 * 4 + 1 + 5 + 9 = 27.
令F(N)表示D(N)的最后一位数字。例如:F(567) = 4, F(314159) = 7。
你的问题是,给你两个数A, B,你要计算出∑F(i), i ∈ [A, B]
对于聪明的你这太简单了,赶紧解决去观摩只有神知道的世界吧~

(出题人Troy)

输入格式
第一行输入一个整数T,表述有T组case。(T <=1000)
接下来T行,每行输入两个数字A, B (0 <= A <= B <= 400,000,000)

输出格式
每一行输出一个整数,表示题目所要求的和。

输入样例
3
1 8
28 138
314159 314159

输出样例
36
495
7


解题思路

规律题

这里写图片描述

a < n < b 的过程中尾数0到9依次出现时,D(n)就是0到9各一次出现
所以把 [a,b]切分成一个个类似上图的区间就能减少大量运算,剩下两边的残余数另外计算即可

#include<stdio.h>
int calculate(int a, int b);
int get(int n);

int main()
{
    int t, a, b;
    scanf("%d", &t);

    while(t --)
    {
        scanf("%d %d", &a, &b);
        printf("%d\n", calculate(a, b));
    }
    return 0;
}

int calculate(int a, int b)
{
    int l, r, total = 0;
    l = a % 10;
    r = b % 10;

    // 例:[11, 18],[34, 35] 不包括[18, 22]这种情况
    if(a - l + 10 > b)
    {
        while(a <= b)
        {
            total += get(a);
            a ++;
        }
    }
    else
    {
        total += (b - r - a + l - 10) / 10 * 45;
        for(int i = a; i <= a - l + 9; i ++)
            total += get(i);
        for(int i = b - r; i <= b; i ++)
            total += get(i);
    }
    return total;
}

int get(int n)
{
    int total = 0;
    while(n)
    {
        if(n % 10 % 2)
            total += n % 10;
        else 
            total += 2 * (n % 10);
        n /= 10;
    }
    return total % 10;
}    

猜你喜欢

转载自blog.csdn.net/sinat_34200786/article/details/81321467