首页 > 试题广场 >

被3整除

[编程题]被3整除
  • 热度指数:138977 时间限制: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整除。
a, b = map(int, input().split())
c = 0
for i in range(a,b+1):
    if (i-1)%3 == 0:
        c = c + 1
print(b-a+1-c)
先找到规律,然后找不能被三整除的
发表于 2020-08-07 10:44:32 回复(0)
关键是将列表内整数转换成字符串然后合并字符串
while True:
    try:
        count=0
        l=int(input())
        r=int(input())
        for i in range(l,r+1):
            b=[str(j) for j in range(1,i+1)]
            b=''.join(b)
            b=int(b)
            if b%3==0:
                count+=1
        print(count)
    except:
        break

发表于 2020-04-24 11:13:32 回复(0)
请问下面代码有什么问题?提交有时可以通过有时不行,不行时显示的状态是 返回非零,希望各位大神可以指教。

import sys

inp = sys.stdin.readlines()
l, r = int(inp[0].split()[0]), int(inp[0].split()[1])

n = int((r + 2) / 3)
m = int((l + 1) / 3)
count = r - l + 1 - n + m

print(int(count))
发表于 2020-03-25 12:23:17 回复(0)
while True:
    try:
        a = list(map(lambda x:[int(x[0]) - 2,int(x[0]) - 1],input().split()))
        print(a[1] // 3 * 2 + a[1] % 3 - a[0] // 3 * 2 - a[0] % 3)
    except:
        break

发表于 2020-03-13 15:53:37 回复(0)
while True:
    try:
        l,r = map(int,input().split())
        temp,ans,count = "",[],0
        for i in range(1,r+1):
            temp += str(i)
            ans.append(temp)
        for i in range(l,r+1):
            if int(ans[i-1])%3 == 0:
                count += 1
        print(count)
    except:
        break

发表于 2020-03-09 12:03:38 回复(0)
1 2  3 4 5.......n
一。各位数只和为3的倍数就可以整除。
二。没三个数字组成三个一组的组合(1 2 3)(4 5 6)。。。([n-2] [n-1] [n])只要凑成一组就能整除。
三。在没凑成一组时,如:(1 2 3)(4 5)此时n=5,其组合中被三整除的数有
f(x)=(x//3)*2 +s注释(没一组三个数中就有2/3个数被整3除【我写成了x/3*2】)
其中 s 的值为:不满足三个是如果 取余3 为2,则可以整除,s=1 只有一个
如果 取余3  不为2  ,则不满足整除 , s=0 没有整除

四 。整数a1~an中有(an-n1+1)个数子,所以带入函数时a(r)-a(l-1) 我写成了   l-1.


l,r=map(int,input().split())
def a(n):
if n%3==2:
s=1
else:
s=0
num=(n//3)*2 + s
return num
print(a(r)-a(l-1))

编辑于 2019-10-07 16:28:44 回复(0)
try: while True:
        a = input().split()
        time = 1    count = 0
       result = []
        temp1 = int(a[0])
        temp2 = int(a[1])  while time <= temp2:
            result.append(str(time))
            time += 1   result1 = ''.join(result)  while temp1 <= temp2:
            num = int(result1[:temp1])  if num % 3 == 0:
                count += 1    temp1 += 1   print(count) except:  pass

发表于 2019-08-29 15:24:17 回复(0)
def fun(num):
    ret = sum(range(1, num+1))
    return ret
for line in sys.stdin:
    temp = list(map(int, line.split()))
    l, r = temp[0], temp[1]
    count = 0
    for el in range(l, r+1):
        if fun(el)%3==0:
            count += 1
    print(count)
编辑于 2019-08-28 14:48:56 回复(0)
d_start,d_end = input().split()
count=0
def data_gennerate(n):
    
    if n==1:
        return 1
    else:
        ssdata=int(data_gennerate(n-1))*(10**(len(str(n))))+n
        return ssdata
for i in range(int(d_start),int(d_end)+1):
    if data_gennerate(i)%3==0:
        count=count+1
print(count)
#求检察错误

发表于 2019-08-16 21:09:48 回复(1)
l, r = list(map(int, input().rstrip().split()))
def func(n):
    if n % 3 == 0:
        return (n // 3) * 2
    elif n % 3 == 1:
        return (n // 3) * 2
    elif n % 3 == 2:
        return (n // 3) * 2 + 1
if l % 3 == 0:
    print(func(r) - func(l)+1)
elif l % 3 == 1:
    print(func(r)-func(l))
else:
    print(func(r)-func(l)+1)


发表于 2019-08-05 14:15:23 回复(1)
def find(n):
    i = (n//3)*2
    if n%3-1>0:
        i += int(1)#i+=1这里,为什么这里把int去掉就报错了。“请检查是否存在语法错误或者数组越界非法#访问等情况“

    else:
        pass
    return i
if __name__ == "__main__":
    l, r = list(map(int, input().strip().split()))
    print(find(r) - find(l - 1))

不理解。

发表于 2019-08-05 13:25:42 回复(0)
import sys
l,r=map(int,sys.stdin.readline().split())
def getnum(integer):
    if integer-integer//3*3==2:
        s=1
    else:
        s=0
    return integer//3*2+s
print(getnum(r)-getnum(l-1))

发表于 2019-08-05 10:31:01 回复(1)
try:
    #转换成字符串做
    while True:
        [l, r] = [int(i) for i in input().split()]
        
        res = 0
        temp = ''
        for i in range(1,l):
            temp += str(i)
        for i in range(l, r+1):
            temp += str(i)
            Sum = sum([int(i) for i in list(temp)])
            if Sum % 3 == 0:
                res += 1
                
        print(res)
except:
    pass

编辑于 2019-08-04 19:27:34 回复(0)
python
 while 1:
    try:
        lists = list(map(int, input().strip().split(' ')))
        l = lists[0]
        r = lists[1]
        cnt = 0
        resum = 0
        for i in range(1, l + 1):
            resum += i

        if resum % 3 == 0:
            cnt += 1

        secsum = 0
        for j in range(l+1, r+1):
            secsum = resum + j + secsum
            if secsum % 3 == 0:
                cnt += 1
        print(cnt)
    except:
        break

编辑于 2019-08-03 17:16:44 回复(0)
def nums(l,r):
    count=0
    k=[]
    star='' 
    for n in range(1,1e9):
        star=star+str(n)
        k.append(int(star))
    for i in range(len(k)):
        while( i+1<=l and r<=1e9):
            if k[i+1]/3==0:
                count+=1
            else:
                pass
    return count 
发表于 2019-08-03 13:29:23 回复(0)
想法很简单,首先知道:如果一个数字,各位相加之和是3的倍数,则这个数也是3的倍数
那么看这组数列的规律,一定以3为周期。在每个周期内,第一个数肯定不行,多出来一个1(如1、4、7、10....),而第二个多出来个2,整个和第一个多出来的1相加,是3的倍数;而周期内第三个数不用说,肯定就是3的倍数,因此,每个周期内有两个符合(第二个和第三个)。
因此前n个数字,一定共有(n//3)*2,加上是否余数为2情况下多出来的1,满足3的倍数了
我就用大的范围减小的范围思想,0~r 减去0~l,就可以了。
def getNum(n):  if(n<1):  return 0 else:
        num = (n // 3) * 2    if(n % 3)>1:
            num += 1    return num
datain = input().strip().split()
l = int(datain[0])
r = int(datain[1]) print(getNum(r)-getNum(l-1))
print(getNum(r)-getNum(l-1))

编辑于 2019-07-31 16:26:46 回复(0)
l,r = map(int,input().split())
count=0
for i in range(l,r+1):
    f=lambda i:(1+i)*i/2
    if f(i)%3==0:
        count+=1
print(count)


使用的公式法进行计算,请问为什么在本地可以通过,但是提交无法通过,是因为乘法的时间复杂度吗?
编辑于 2019-07-25 10:19:02 回复(0)
while True:
    try:
        trans = [int(elem) for elem in input().split()]
        m = trans[0]; n= trans[1]
        count = 0
        for k in range(m,n+1):
            number = ''
            for elem in range(1,k+1):
                number+=str(elem)
            if int(number)%3==0:
                count+=1
            else:
                continue
        print(count)
    except:
        break
发表于 2019-07-21 22:35:03 回复(0)