java使用算术运算,一共进了多少球?
一名男子正在为一场足球比赛记分。他跟踪的部分结果如下:1-0,1-1,2-1,2-2,3-2。所有这些部分结果中的目标总和为15,最终结果为3-2,即5个目标。给定N
这是部分结果的目标之和,您需要找到最终结果的目标数。以下是一些例子:
Input 15
Output 5Input 6
Output 3Input 55
Output 10
我不能用循环来解决这个问题;我只能使用if/else和算术运算。仅使用这些操作,我如何才能找到最终结果的目标数
# 1 楼答案
似乎算术级数S(n)的和是给定的,你必须找到n。 使用简单的数学公式计算n:
# 2 楼答案
关于是否允许平方根,这个问题是不明确的,它是否严格算作算术运算
如果我们假设它是不允许的,并且我们不能使用任何循环,那么我们可以使用Newton's method来给出一个很好的近似答案。其他人指出,我们基本上是在尝试寻找三角形数
T(n)=n(n+1)/2
的倒数。如果给我们一个求和S
让f(n)=n^2/2+n/2-S
,我们要解f(n)=0
。牛顿法是一种快速迭代法,给定初始猜测x0,我们可以使用x1找到更好的猜测其中
df(x)=x-1/2
是导数。如果我们这样做4次,就会得到一个很好的解决方案当输入351,输出26时,这项功能非常有效。但下一次输入378失败,目标是28而不是27
通过使用牛顿法的5个步骤,我们可以改进一些东西,输入为1176,输出为48。调整初始猜测可以显著提高性能,使用n/16的起始猜测和5个步骤可以工作到输入42195输出290
使用Fast inverse squareroot可以找到更好的解决方案。这可以在this answer之后的Java中实现
我们的牛顿迭代法是
只有3个迭代步骤
这将工作到输入1073720960输出46340。than之后的下一项在计算总和时会出现整数溢出,因此可以说它适用于所有合法的int值
这可能不算是一个合法的解决方案,因为它使用了
floatToIntBits(x)
和intBitsToFloat(x)
这两种方法并不是真正的算术运算# 3 楼答案
这是一个求和问题。每次进球时都会创建一个记录。该记录始终比上一个记录大一个。总数是所有记录的总和
总数=总和(得分的目标数)
总目标数是1,那么你知道目标数也是1
如果总数为三,则有两个进球(1和1+1)
55=10+9+8+7+6+5+4+3+2+1,所以一共进了10个球
编辑计算实际答案比使用其他答案中显示的分数数学简单,但它需要解一个二次方程
# 4 楼答案
这告诉我们s只是前n个整数的和,但我们需要n(s),而不是s(n)
下面是一个计算示例
下面是在java中实现这一点的代码:
以下是输出: