求指定区间内能被3,5和7整除的数的个数输入格式:在一行中从键盘输入2个正整数a,b1ab10000000用空格隔开。输出格式:在一行输出大于等于a且小于等于b的能被3,5和7整除的数的个数。这是一开始做的没有注意大题目需要用集合实现不过运行起来也是对的。a,blist(map(int,input().split())) fFalse total0 for i in range(a,b1): if i%30 and i%50 and i%70: total1 fTrue if not f: print(0) else: print(total)后面想在原题的基础上略微改一下a,blist(map(int,input().split())) sset(range(a,b1))#或者s{x for x in range(a,b1)} total0 fFalse for i in s: if i%30 and i%50 and i%70: total1 fTrue if not f: print(0) else: print(total)虽然运行结果是正确的但是把1ab10000000存入集合里会内存很大所以最后题报了内存超限。a,blist(map(int,input().split())) sset() fFalse for i in range(a,b1): if i%30 and i%50 and i%70: s.add(i) fTrue if not f: print(0) else: print(len(s))上面这个代码是完全正确的。a,blist(map(int,input().split())) sset() fFalse start(a104)//105*105 for i in range(start,b1,105): s.add(i) fTrue if not f: print(0) else: print(len(s))虽然正确但是运行速度太慢所以进行了修改3.5.7的最小公倍数是105所以有了start(a104)//105*105这一步意思是第一个a的105倍数。但不能直接(a,b,105),因为不能保证a一开始就是105的倍数。import math a,blist(map(int,input().split())) sset() fFalse startmath.ceil(a/105)*105 for i in range(start,b1,105): s.add(i) fTrue if not f: print(0) else: print(len(s))还可以引入math函数ceil的意思是向上取整//的意思是向下取整举个例子假设a是104或105当104时在start(a104)//105*105中先对1.9进行向下取整到1再1*105在math.ceil(a/105)*105中start是先对0.99向上取整到1再*105。之所以在start(a104)//105*105中是加104而非105因为若是a初始就为105会变为210//1052*105这样在for i in range(start,b1,105):里就不对了本来初始是105的现在变为210会使最后结果少统计。英文含义Python实现floor向下取整取 ≤ x 的最大整数int(x)或math.floor(x)ceil向上取整取 ≥ x 的最小整数math.ceil(x)