首页 > 试题广场 >

被3整除

[编程题]被3整除
  • 热度指数:2211 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

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

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

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


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


输出描述:
输出一个整数, 表示区间内能被3整除的数字个数。
示例1

输入

2 5

输出

3

说明

12, 123, 1234, 12345...
其中12, 123, 12345能被3整除。
var line = readline().split(' ');
var l = parseInt(line[0]);
var r = parseInt(line[1]);
function f(l,r){
    var a = [];
    a[0] = 0;
    a[1]=1
    var k = 0;
    for(var i = 2;i<=r;i++){
        a[i] = a[i-1]+""+i;
    }
    for(var j = l;j<=r;j++){
        if(0===a[j]%3){
            k++;
        }
    }
    return k;
}
console.log(f(l,r))

求解答,这样写为什么错的
发表于 2018-07-02 20:46:42 回复(5)
//计算指定数列能被3整除数的个数
var calNum=function(num) {
if (num%3===0) {
return num/3*2;
}else{
//取被3整除后多余的个数
var rest=num%3-1;
return Math.floor(num/3)*2+rest;
}
};

(function() {
//输入区间
var input=readline().split(' ');
var start=parseInt(input[0]);
var end=parseInt(input[1]);
//var start=10,end=110;

//每3个数有两个能被3整除
//var count=calNum(end)-calNum(start);
//判断首位是否需要
var count=calNum(end)-(start%3==1? calNum(start): calNum(start)-1);
//console.log(count);
print(count);
})();
编辑于 2019-04-24 10:19:02 回复(0)
//对于1,12,123,1234,12345,123456......1234567891011
//   011 011 011 011  发现没3个数字为一个循环,每个循环有2个能被3整除
//题目说的是第l到第r,所以是从1开始的,而不是0开始
var line = readline().split(' ');
var l = parseInt(line[0]);
var r = parseInt(line[1]);
//代入右端点,求得的是定死右端点时,能被3整除的最多个数,包括右端点,所以下面是l-1
function isThree(r) {
    var res = 0;
    if (r % 3 != 0) { 
     //这里r/3就是求得有多少个循环.2是每个循环有2个能被3整除
     //不能被3整除,可以把余数理解为是最后一个不完全循环中的数字的个数,
     //那么-1就是因为循环中的第一个数字是0,代表不能被3整除
        res = Math.floor(r / 3) * 2 + (r % 3 - 1);
    } else {            //能被3整除
        res = Math.floor(r / 3) * 2;
    }
     return res;
}
//之所以要减去isThree(i-1),是因为左端点还没固定
console.log(isThree(r) - isThree(l - 1));

编辑于 2018-07-17 10:21:45 回复(8)
#include<stdio.h>
#define ***(x)  (((x)+2)/3)
int main(){
  int r,l;
while(~scanf("%d,%d",&l,&r))
printf("%d\n",r-l+1-***(r)+***(l-1));
return 0;
}

发表于 2018-06-02 10:11:33 回复(1)
functioncount(a,b){
        let num=[],counts=0,n='',m=[];
        for(let i=1;i<=b;i++){
            n=n+String(i);
            num.push(Number(n))
        }
        m=num.slice(a-1,b);
        for(let j=0;j<m.length;j++){
            if(m[j]%3==0){
                counts=counts+1
            }
        }
        returncounts
    }我这只是没做校验不严格而已哪里错了

发表于 2020-10-12 17:32:50 回复(0)
var line = readline().split(' ');
var a = parseInt(line[0]);
var b = parseInt(line[1]);
 var num = 0;
for(var i = a;i <= b; i++){
    if(i % 3 != 1){
       num ++;
      }
}
 console.log(num);

//readline()是牛客专门用来获取测试用例的
发表于 2020-08-22 17:38:18 回复(0)
var line = readline().split(' ');
var left = parseInt(line[0]);
var right = parseInt(line[1]);
var count = 0;
var newcount = 0;

    if((left-1)%3!=0){
        count = Math.floor((left-1)/3)*2+(left-1)%3-1;
    }else{
        count = Math.floor((left-1)/3)*2;
    }
    if(right%3==0){
        newcount = Math.floor(right/3)*2;
    }else{
        newcount = Math.floor(right/3)*2+(right%3-1);
    }
    print(newcount-count);
发表于 2019-08-29 11:19:44 回复(0)
var line = readline().split(' ');
var l = parseInt(line[0]);
var r = parseInt(line[1]);
function chu(r){
    //先求出右端点的个数
    var count=0;
    if(r%3!=0){
        count = Math.floor(r/3)*2+(r%3-1);
         
    }
    else{
        count = Math.floor(r/3)*2;
    }
    returncount;
     
}
    //因为端点包括  因此算左端点要减一
console.log(chu(r)-chu(l-1));
发表于 2019-08-02 21:18:22 回复(0)
wx_头像 wx_

python 版本, 找规律

n,m=[int(i) for i in input().split()]
res=0
def helper(x):
    if x%3==0:
        return (x//3)*2
    if x%3==1:
        return x//3
    else:
        return (x//3)*2+1
res=helper(m)-helper(n-1)
发表于 2019-08-02 10:11:11 回复(0)
#只过60%,求问哪里错了
s = input().split()
l = int(s[0])
r = int(s[1])
def isOk(n):
    if n == 1:
        return 0
    if n == 2:
        return 1
ter = 0
if l%3 != 1:
    ter = 1
print((r//3)*2 + isOk(r%3) - (l//3)*2 - isOk(l%3) + ter)

发表于 2019-06-19 22:49:44 回复(0)
#include<stdio.h>

int main(){

    int l, r;
    scanf("%d%d", &l, &r);

    int count = 0;
        //从1开始,每3个数为1个循环,011, 011, ...
    if(l%3 == 1){
        count = count + (r-l+1)/3 * 2;
    }
    else if(l%3 == 2){
        count = count + (r-l-1)/3 * 2 + 2;
//        count = count + (r-(l+2)+1)/3 * 2 + ((r-(l+2)+1)%3 - 1) + 2;
    }
    else{
        count = count + (r-l)/3 * 2 + 1;
    }
    if((r%3 == 1) || (r%3 == 2)) count += r%3 - 1;
    //处理最后超出的部分

    printf("%d\n", count);

    return 0;
}
编辑于 2018-08-28 21:29:40 回复(0)
var line = readline().split(' ');
var l = parseInt(line[0]);
var r = parseInt(line[1]);

function divisibleByThree(l, r) {
    if (!(l >= 1 && r >= 1 && l <= 1e9 && r <= 1e9 && l <= r)) {
        return 0;
    }
    var count = 0;
    var temp1 = Math.floor((r - l + 1) / 3);
    var temp2 = (r - l + 1) % 3;
    var temp3 = l % 3;
    count += temp1 * 2;
    if (temp2 === 2) {
        if (temp3 === 2) {
            count = count + 2;
        } else {
            count = count + 1;
        }
    } else if (temp2 === 1) {
        if (temp3 === 2) {
            count++;
        }
    }
    return count;
}
console.log(divisibleByThree(l, r));

发表于 2018-07-07 16:56:27 回复(0)
<?php
while(fscanf(STDIN, "%d %d", $a, $b) == 2){
     $num = 0;
    $start = $i= 1;
    while($start < $a-1){
       $i .= ++$start;
    }
    for(;$a <= $b; ){
        $i .= $a;
        $arr = str_split($i);
        $sum = 0;
        for($j = 0;$j<count($arr);$j++){
            $sum += $arr[$j];
        };
        if($sum%3==0){
          $num++;
        }
        $a++;
    }
   echo $num;
}
?>
发表于 2018-06-29 11:18:22 回复(1)