没有循环的前N个数的和或递归或乘法

时间:2018-05-28 12:38:22

标签: java sum

我被赋予了用Java编写方法的任务,该方法计算第一个N正数的总和。但我不能使用任何循环(如fordo-while等),我也不能使用迭代。后者的原因是它甚至在开始任何计算之前占用了大量的堆空间。我也不能使用乘法。

他们有自己的不可变Number类,我必须返回它,并且有01的实例。我无法创建任何新实例,但我可以添加两个实例并获得结果。

因此,例如,我不能只返回n * (n + 1) / 2,因为禁止乘法。我甚至试图通过添加对数来进行乘法,但即使我有答案,我也无法返回它,因为我无法创建相应的Number实例。所以我猜我必须使用Number附带的添加功能。

我应该通过创建一些我写的不可变类的实例来解决问题,并将小计传递给新实例。很清楚。我不清楚的是,最后我仍然需要使用一些循环或某种递归,不需要我吗?或者还有另一种方式吗?

编辑:以下是Number的代码:https://pastebin.com/N8WNvmxKNumber位于包f中,我根本无法修改)

更新:事实证明我可以利用他们提供的类中的一种方法,因为它中有一个while循环。所以我可以进行迭代。

8 个答案:

答案 0 :(得分:2)

我猜你的主要问题实际上不是计算答案,而只是有效地构建(其他答案清楚地显示了你可用于计算的公式)。 / p>

您可以使用二进制表示构造数字,并为二进制表示的每个1创建中间部分数。

说,从110的总和为55,二进制为11011132 + 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;