我想制作一个程序,找出一个数字可以被3或5整除的数量,例如10有3 9 6可被3整除,有5和10可被5整除所以总数是5等等所以我写我的代码
import math
n=float(raw_input())
div3=(n-2)/3
div5=(n-4)/5
f1=math.ceil(div3)
f2=math.ceil(div5)
sumss=f1+f2
print int(sumss)
但是在某些数字中它会得到错误的答案并且输入数字的范围将是 从1到10 ^ 18所以我需要在其中使用数学因为问题测试的时间限制是2秒任何一个有任何有效的方程式使得循环不能使它花费很长时间
答案 0 :(得分:2)
这可能是一个项目欧拉问题。问题是3
和5
可以分享一些号码。例如22
:
3
的除数:3
6
,9
,12
, 15
,{{1 },18
。
21
的除数:5
5
, 10
,15
两个20
都出现了,所以你进行了重复计算。
优点是15
和3
是相对素数,因此共享的唯一数字是5
可分割的数字。所以你只需要撤消重复计算:
15
如果您允许重复计算(n=int(raw_input())
div3=n//3
div5=n//5
div15=n//15
sumss=div3+div5-div15
print sumss
应计算两次),您只需使用:
15
请注意,程序省略了浮点运算:这将导致更快和更精确的程序,因为浮点数与有限的mantisse一起使用,因此无法正确表示大数(由于小错误导致)。此外,通常整数运算更快。
现在,Project Euler的问题陈述有点不同:它要求总结这些数字。为了做到这一点,你必须构造一个表达式来总结 l 的第一个 k 倍数:
n=int(raw_input())
div3=n//3
div5=n//5
sumss=div3+div5
print sumss
使用 Wolfram Alpha ,获得this expression。所以你可以将它们计算为:
k
---
\
/ l*i
---
i=1
此计划为def suml (k,l) :
return k*(k+1)*l/2
n=int(raw_input())
div3=n//3
div5=n//5
div15=n//15
sumss=suml(div3,3)+suml(div5,5)-suml(div15,15)
print sumss
提供了119
,如果您只计算一次n=22
,那么您可以在上面进行验证。
答案 1 :(得分:1)
我不确定我的问题是否正确,但这里有一些想法:
n=float(raw_input())
div3=int(n/3)
div5=int(n/5)
div15=int(n/15)
sumss=div3+div5-div15
print sumss
编辑:啊,找到了Euler项目。
如果我们列出10以下的所有自然数,它们是3或3的倍数 5,我们得到3,5,6和9.这些倍数的总和是23。
查找低于1000的3或5的所有倍数的总和。
这是一个不同的任务,然后在这里发布的问题。它表示吼叫数字,并找到总和。
我不确定在这里发布解决方案是否正确,所以我宁愿不这样做。
EDIT2:来自Project Euler:
我们希望您喜欢解决这个问题。请不要剥夺 其他人通过发布您的解决方案来完成相同的过程 项目欧拉之外。如果您想分享您的见解,请 转到讨论论坛中的第1个帖子。