我被赋予了用Java编写方法的任务,该方法计算第一个N
正数的总和。但我不能使用任何循环(如for
,do-while
等),我也不能使用迭代。后者的原因是它甚至在开始任何计算之前占用了大量的堆空间。我也不能使用乘法。
他们有自己的不可变Number
类,我必须返回它,并且有0
和1
的实例。我无法创建任何新实例,但我可以添加两个实例并获得结果。
因此,例如,我不能只返回n * (n + 1) / 2
,因为禁止乘法。我甚至试图通过添加对数来进行乘法,但即使我有答案,我也无法返回它,因为我无法创建相应的Number
实例。所以我猜我必须使用Number
附带的添加功能。
我应该通过创建一些我写的不可变类的实例来解决问题,并将小计传递给新实例。很清楚。我不清楚的是,最后我仍然需要使用一些循环或某种递归,不需要我吗?或者还有另一种方式吗?
编辑:以下是Number
的代码:https://pastebin.com/N8WNvmxK(Number
位于包f
中,我根本无法修改)
更新:事实证明我可以利用他们提供的类中的一种方法,因为它中有一个while循环。所以我可以进行迭代。
答案 0 :(得分:2)
我猜你的主要问题实际上不是计算答案,而只是有效地构建(其他答案清楚地显示了你可用于计算的公式)。 / p>
您可以使用二进制表示构造数字,并为二进制表示的每个1
创建中间部分数。
说,从1
到10
的总和为55
,二进制为110111
(32
+ 16
+ {{1} } + 4
+ 2
)。您可以通过将两个previos副本加在一起来计算每个所需的两个幂,然后累积到最终结果中。
答案 1 :(得分:0)
你应该返回(N*(N+1))/2
,但这不是一个java编程问题,而是一个基本的数学问题。
答案 2 :(得分:0)
使用公式将前n个自然数求和为:((n ** 2)+ n)/ 2
根据您的需要使用Java或任何语言对其进行编码。
func tapOneAct(sender: UITapGestureRecognizer) {
if(sender.view!.restorationIdentifier == "view1")
// view1 is `Restoration ID` of imageViewOne
{
view.bringSubview(toFront: imageViewOne)
}
if(sender.view!.restorationIdentifier == "view2")
// view2 is `Restoration ID` of 2nd view
{
view.bringSubview(toFront: imageViewTwo)
}
}
参考:https://trans4mind.com/personal_development/mathematics/series/sumNaturalNumbers.htm
答案 3 :(得分:0)
已经给出了实际的数学解法。现在以法律主义的方式:
Number squareSum(Number n) {
Number nPlus1 = n.plus(Number.ONE);
Number prod = n.times(nPlus1);
Number two = Number.ONE.plus(Number.ONE);
return prod.dividedBy(two);
}
Number应该以方法plus
(或add
)等方式提供操作。
为了减少产品上的溢出,如果可以使用Number检查数字是偶数还是奇数(模数,位和),则可以在N或N + 1上进行除法。
(尽管有问题陈述,但有3个值可用:1,0和N. )
在给出数字API之后:
我认为这很简单:
Number squareSum(Number n) {
double x = n.value();
return new Number(x * (x + 1) / 2);
}
这就是追问公式N *(N + 1)/ 2的问题,
和 value
的用法。此方法不公开,但是包范围,
你的答案是在同一个包中。
答案 4 :(得分:0)
返回LongStream.range(1,N + 1).sum():
答案 5 :(得分:0)
好吧,因为你可以使用Stream
s:
Number result = Stream.iterate(Number.ONE, n -> n.add(Number.ONE))
.limit(N)
.reduce(Number.ZERO, Number::add);
答案 6 :(得分:0)
如果您对作弊感到不满意,可以使用以下方法。在第一眼看起来并不像任何有用的东西。但它完成了工作。仍然使用循环,它们只是不可见:
private static Number getSum(long N){
// \u000d\u004E\u0075\u006D\u0062\u0065\u0072\u0020\u0072\u0065\u0073\u0075\u006C\u0074\u0020\u003D\u0020\u004E\u0075\u006D\u0062\u0065\u0072\u002E\u005A\u0045\u0052\u004F\u003B\u000A\u0066\u006F\u0072\u0028\u006C\u006F\u006E\u0067\u0020\u006C\u0020\u003D\u0020\u0030\u003B\u0020\u006C\u0020\u003C\u0020\u0028\u004E\u0020\u002A\u0020\u0028\u004E\u0020\u002B\u0020\u0031\u0029\u0020\u002F\u0020\u0032\u0029\u003B\u0020\u006C\u002B\u002B\u0029\u007B\u000A\u0020\u0020\u0020\u0020\u0072\u0065\u0073\u0075\u006C\u0074\u0020\u003D\u0020\u0072\u0065\u0073\u0075\u006C\u0074\u002E\u0061\u0064\u0064\u0028\u004E\u0075\u006D\u0062\u0065\u0072\u002E\u004F\u004E\u0045\u0029\u003B\u000A\u007D\u000A\u0072\u0065\u0074\u0075\u0072\u006E\u0020\u0072\u0065\u0073\u0075\u006C\u0074\u003B
}
此方法将为您提供正确的Number
。
E.g。 getSum(4)
将返回Number
,其值为10.0
。
答案 7 :(得分:0)
只使用Math.pow,还是也被禁止?
(int) (Math.pow(n, 2) + n) / 2;