找到最接近的五边形数,给定一个正整数 S,其中 S ≥ 1
Finding the closest pentagonal number, given a positive integer, S where S ≥ 1
我需要在 R 中创建一个函数,它以整数 S ≥ 1 和 returns 作为输出,最接近我函数输出的 S.The 的五边形数应该是满足|−|≤|−|的五边形数对于所有正整数 m.
但是,如果我能得到两个不同的五边形数,当整数出现时,s 就在它们的中间。那么它取哪一个都没有关系(更大或更小的值)就像当 S 是 17 并且最接近 17 的五边形数是 12 和 22 所以它可以取任何一个。
这是我创建的以下代码,用于查找给定正整数 n 的五边形数:
P_n=function(n){
x=(3*n^2-n)/2
if(n == 0){
return (0)
}else{
return(x)
}
}
在编写了查找 pn 的代码之后,我现在一直在寻找整数 s 的最接近五边形数。我知道主要的想法是使用上限和下限函数来区分 Pm 和 Pn,但我真的不知道如何 link 它到方程 |−|≤|−|.
不需要循环,只需解决以下问题:
对于输入 S 找到最小 n 使得:3n^2-n-2S >= 0
通过这样做,你得到了你的两个候选人:
n <- (1 + sqrt(1 + 24 * S)) / 6
p1 <- P_n(floor(n))
p2 <- P_n(ceiling(n))
c(p1, p2)[which.min(c(S - p1, p2 - S))]
在差异相同的情况下,这将更喜欢较低的五边形数(因为 which.min
在相等数的情况下的工作方式)。
您可以试试下面的代码
P_n <- Vectorize(function(n) max((3 * n^2 - n) / 2, 0))
k <- floor((1 + sqrt(1 + 24 * x)) / 6)
(n <- k - 1 + which.min(abs(P_n(c(k,k+1)) - x)))
示例 1
> x <- 18
> k <- floor((1 + sqrt(1 + 24 * x)) / 6)
> (n <- k - 1 + which.min(abs(P_n(c(k,k+1)) - x)))
[1] 4
示例 2
> x <- 17
> k <- floor((1 + sqrt(1 + 24 * x)) / 6)
> (n <- k - 1 + which.min(abs(P_n(c(k,k+1)) - x)))
[1] 3
我需要在 R 中创建一个函数,它以整数 S ≥ 1 和 returns 作为输出,最接近我函数输出的 S.The 的五边形数应该是满足|−|≤|−|的五边形数对于所有正整数 m.
但是,如果我能得到两个不同的五边形数,当整数出现时,s 就在它们的中间。那么它取哪一个都没有关系(更大或更小的值)就像当 S 是 17 并且最接近 17 的五边形数是 12 和 22 所以它可以取任何一个。
这是我创建的以下代码,用于查找给定正整数 n 的五边形数:
P_n=function(n){
x=(3*n^2-n)/2
if(n == 0){
return (0)
}else{
return(x)
}
}
在编写了查找 pn 的代码之后,我现在一直在寻找整数 s 的最接近五边形数。我知道主要的想法是使用上限和下限函数来区分 Pm 和 Pn,但我真的不知道如何 link 它到方程 |−|≤|−|.
不需要循环,只需解决以下问题:
对于输入 S 找到最小 n 使得:3n^2-n-2S >= 0
通过这样做,你得到了你的两个候选人:
n <- (1 + sqrt(1 + 24 * S)) / 6
p1 <- P_n(floor(n))
p2 <- P_n(ceiling(n))
c(p1, p2)[which.min(c(S - p1, p2 - S))]
在差异相同的情况下,这将更喜欢较低的五边形数(因为 which.min
在相等数的情况下的工作方式)。
您可以试试下面的代码
P_n <- Vectorize(function(n) max((3 * n^2 - n) / 2, 0))
k <- floor((1 + sqrt(1 + 24 * x)) / 6)
(n <- k - 1 + which.min(abs(P_n(c(k,k+1)) - x)))
示例 1
> x <- 18
> k <- floor((1 + sqrt(1 + 24 * x)) / 6)
> (n <- k - 1 + which.min(abs(P_n(c(k,k+1)) - x)))
[1] 4
示例 2
> x <- 17
> k <- floor((1 + sqrt(1 + 24 * x)) / 6)
> (n <- k - 1 + which.min(abs(P_n(c(k,k+1)) - x)))
[1] 3