题目描述
小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整除。
算法思路:用列表保存这个规律数列:即[1,2,3,4,5,6,7,8,9,10...........],测试每一个数的时候就进行组合,解题关键在于如何判断被3整除:我们拿一个三位数举例:576
能被3整除那就可以被3的倍数整除所有576=100*5+10*7+6 = 99*5+9*7+5+7+6,所以只要判断每位数相加的和是否能被3整除
python:
def choice(a,m,n):
totle = 0
for i in range(m,n):
totle+=a[i]
if totle%3 == 0:
return True
return False
def create_array(r):
a = []
t = 1
for i in range(r):
a.append(t)
t += 1
return a
def solve(l, r):
a = create_array(r)
count = 0
#print(a)
for i in range(l, r+1):
if choice(a,0,i):
count = count+1
return count
if __name__ == '__main__':
l,r = input().split()
count = solve(int(l),int(r))
print(count)
#include<iostream>
using namespace std;
int main(){
int left, right;
int result = 0;
cin >> left >> right;
for(int i=left; i<=right; ++i){
switch(i%3){
case 1: ;break;
case 2: ++result;break;
case 0: ++result;break;
}
}
cout << result << endl;
}