0

我对 R 很陌生,只是在玩它。我写了一些代码来计算给定两个边的可能 Heron 三角形的数量。正如我们许多人所知,苍鹭三角形的所有边和面积都是整数。在下面给出的代码中,a & b 是整数。

heron <- function(a,b)
{
  d = 0
  for(c in abs(a-b)+1:a+b-1)
  {
    area <- ((1/4)*sqrt((a^2+b^2+c^2)^2-(a^4+b^4+c^4)))
    d <- ifelse(area == floor(area), d+1, d)
  }

  return(d)
}

代码返回错误的值。例如,heron(5,5)=2但是当我插入a=5,时b=5,它给出的答案是0. 看代码,很明显for循环和ifelse部分有问题;但我无法弄清楚,因此这个问题。提前致谢。

4

2 回答 2

2

我在您的代码中看到两个错误。

首先:根据this Wiki Page,您的公式不正确,您忘记了2(平方根)

第二:在 for 循环中,您必须添加一些额外的括号(在 R 中10 + 1:12 != 11:12

heron <- function(a,b)
{
  d = 0
  for(c in (abs(a-b)+1):(a+b-1))
  {
    area <- ((1/4) * sqrt((a^2+b^2+c^2)^2 - 2 * (a^4+b^4+c^4)))
    d <- ifelse(area == floor(area), d+1, d)
  }

  return(d)
}

heron(5, 5)
[1] 2
heron(13, 25)
[1] 0

没有 for 循环的第二种解决方案

Heron <- function(a, b) {
C <- (abs(a-b)+1):(a+b-1)
Res <- sapply(C, function(i) 
                  ((1/4) * sqrt((a^2+b^2+i^2)^2 - 2 * (a^4+b^4+i^4))))
length(Res[Res == floor(Res)])
}
Heron(5, 5)
[1] 2
Heron(13, 25)
[1] 0
于 2012-08-15T20:40:30.410 回答
1

我假设您遇到了浮点数学错误。如果你仔细计算:

a <- 5
b <- 5

c我可以从您的代码中收集信息for loop,但它并没有按照您的想法做:

abs(a-b)+1:a+b-1

给出数字 5 到 9. abs(a-b)+ (1 through a+b) - 1. 而不是(abs(a-b) + 1) through (a + b - 1)

c <- 1:9

area <- 1/4 * sqrt((a^2 + b^2 + c^2)^2 - (a^4 + b^4 + c^4))

> area
[1]  9.185587 10.155048 11.592023 13.346348 15.309311 17.410485 19.605484 21.866070 24.173850
> 

它们都不是整数。因此,d保持在 0。

我也放弃了你的 for 循环。您可以使用 R 的矢量化特性来进行此计算。它会根据需要重复多次,以使a向量的长度与 相同。bareac

然后是这样的:

length(area[area==floor(area)])

会给你苍鹭三角形的数量。其他更了解该公式的人将不得不告诉您它是否正确。

于 2012-08-15T20:36:32.743 回答