网易2018实习生笔试题 被三整除

时间限制:1秒

空间限制:32768K

问题描述:

小Q得到一个神奇的数列: 1, 12, 123,...12345678910,1234567891011...。

并且小Q对于能否被3整除这个性质很感兴趣。

小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。

输入描述:

输入包括两个整数l和r(1 <= l <= r <= 1e9), 表示要求解的区间两端。

输出描述:

输出一个整数, 表示区间内能被3整除的数字个数。

输入例子1:

2 5

输出例子1:

3

例子说明1:

12, 123, 1234, 12345...
其中12, 123, 12345能被3整除。

解题思路:

观察发现从1,12,123,1234,12345,123456。。。。。。能被三整除的规律为:不能,能,能,不能,能,能。。。。。。,以三为周期循环,因而将输入的l,r分别移动至一个周期的第一个位置,在移动过程中标记需要剔除新引入的能被三整除的数目count1,标记需要加上移动过程中删除的能被三整除的数目count,再按公式(r-l)/3*2-count1+count,即可求得能被三整除的数目。

 

#include
int main()
{
    int l,r;
    int count = 0,count1 = 0,result = 0;
    scanf("%d%d",&l,&r);
    while(l%3 != 1)
    {
        if(l%3 == 0) 
        {
            l--;
            count1++;
        }
        if(l%3 == 2) 
            l--;
    }                     
    while(r%3 != 1)
    {
        if(r%3 == 0)
        {
            count++;
            r--;
        }
        if(r%3 == 2)
        {
            count++;
            r--;
        }
    }
    result = (r-l)/3*2 - count1 + count;
    printf("%d\n",result);
}

 

 

 

 

 

你可能感兴趣的:(笔试题)