网易2019编程题 第2题

统计区间[l,r],能被3整除的数字的数量。

Input:
已知数组中,每三个数字,第一个不能被3整除,后面两个都可以被3整除;例如:

数组编号能否被整除
10
21
31
40
51
61
70
81
91

统计数组下标从l到r的范围内,问能被3整除的数字的个数?
其中, 0<=l<=r<=1e9;

分析

可以看出来,每隔3个数字,有2个数字可以被整除;所以中间部分可以直接写出来值来,
即 tot += 中间区间个数(每个区间3个数字)*2;

一头一尾的区间,注意,不要总结规律啦!浪费时间!直接遍历! 最多也就6个数字的遍历,很快的!
另外,特殊情况,l和r在一个区间内,直接遍历就行~

代码:

#include<cstdio>

int fun(int l, int r){
    int ret = 0;
    int div1 , div2;

    div1 = (l-1)/3;
    div2 = (r-1)/3;
    //l和r在一个区间内
    if(div1==div2){
        for(int i=l; i<=r; i++)
            if(i%3!=1)
                ret++;
        return ret;
    }

    //第一部分
    for(int i=l; i<=div1*3+3; i++)
        if(i%3 != 1)
            ret++;
    //最后一部分
    for(int i=div2*3+1; i<=r; i++)
        if(i%3 != 1)
            ret++;
    //中间部分
    ret += (div2 - div1 -1)*2;
    return ret;
}

int main(){
    int l,r;
    while(~scanf("%d%d",&l,&r)){
        int tot = fun(l,r);
        printf("%d\n",tot);
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值