我正在编写一个程序,该程序必须采用整数N,其范围为3 <= N <= 10 ^ 18。 这是我必须对N执行的操作之一。
final=((0.5*(pow(2,0.5))*(pow((pow(((N/2)-0.5),2)+pow((N/2)-0.5,2)),0.5)))-0.5)*4;
N
保证final
包含整数。
问题是我不能以浮点类型存储N
,因为它太大了。如果我将其存储在long int int中,答案是错误的(我认为是这样,因为N / 2
的中间值会四舍五入)。
答案 0 :(得分:2)
正确答案是
final = 2 * abs(N-1) - 2;
这可以通过删除不必要的括号,重新组合相同的术语,通过常数分布乘法以及使用以下标识来验证:
pow(pow(x,2),0.5) = abs(x)
pow(k*x,0.5) = pow(k,0.5)*pow(x,0.5)
k*abs(x+y) = abs(k*x + k*y)
这与接受的答案几乎相同。 但是,其他答案仅对任何N >= 1
是正确的。 N-1<0
就是错误的,因此对于您的问题0 <= N < 1
您可以使用此online demo
进行验证编辑:在您对更改范围的问题进行编辑之后,排除了有问题的值,接受的答案就可以了。我把答案留在这里作记录,也为了数学;-)
答案 1 :(得分:1)
此公式看起来令人生畏,但可以简化为(如果N > 1
)
final = 4 * (N / 2 - 1)
使用身份:(xa)1/a = x
。
如果N / 2
应该是浮点除法而不是整数除法,则答案是
final = 2 * (N - 2)