我知道如何让程序将 3、5 和 7 中每一个的倍数总和相加,但我不确定如何让程序只使用每个数字一次。例如,我可以让程序找出所有数字并将它们相加为 3,然后对 5 执行相同操作,但数字 15 将出现在最终数字中两次。我不确定如何让它只接受一次号码。谢谢你的帮助。
虽然生成和测试方法很容易理解,但如果您想在更大的数字上运行它,它也不是很有效。相反,我们可以使用包含排除原则 http://en.wikipedia.org/wiki/Inclusion%E2%80%93exclusion_principle.
这个想法是首先通过分别查看 3、5 和 7 的倍数来总结太多的数字。然后我们减去计算了两次的数,即 3*5、3*7 和 5*7 的倍数。但现在我们减去了太多,需要再次加回3*5*7的倍数。
我们首先求所有整数的总和1..n
是的倍数k
。首先我们要知道有多少个,m = n / k
,由于整数除法而向下舍入。现在我们只需要总结序列k + 2*k + 3*k + ... + m*k
。我们剔除出k
并得到k * (1 + 2 + ... + m)
.
这是一个著名的算术级数,我们知道它的和k * m * (m + 1)/2
(See 三角形数 http://en.wikipedia.org/wiki/Triangular_number).
private long n = 9999;
private long multiples(long k) {
long m = n / k;
return k * m * (m + 1) / 2:
}
现在我们只需使用包含-排除来得到最终的总和:
long sum = multiples(3) + multiples(5) + multiples(7)
- multiples(3*5) - multiples(3*7) - multiples(5*7)
+ multiples(3*5*7);
这将更好地扩展到更大n
不仅仅是循环所有值,但要注意溢出并更改为BigInteger
如果需要的话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)