我将一些Python代码转换成R格式,但是输出与

2024-04-25 19:32:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做欧拉计划的problem 5。我试图将另一个用户的Python代码转换成R,但是输出是不同的。你知道吗

Python脚本的输出是232792560,其中R脚本的输出是1964187225

错误在哪里?你知道吗

Python代码:

def is_prime(number):
    for n in range(2, number):
        if number % n != 0:
            n += 1
        else:
            return False
    return True


def smallest_multiple(num):
    exp = 1
    result = 1
    for i in range(2, num):
        if is_prime(i):
            while True:
                if i**exp > num:
                    result *= i**(exp-1)
                    break
                exp += 1
            exp = 1
    return result

print(smallest_multiple(20))

R代码:

is_prime <- function(num) {
  for (n in seq(2, num)) {
    if (num %% n != 0) {
      n <- n + 1
    } else {
      return(FALSE)
    }
    return(TRUE)
  }
}

lcm <- function(num) {
  exp <- 1
  result <- 1
  for (i in seq(2, num)) {
    if (is_prime(i)) {
      while (TRUE) {
        if (i ^ exp > num) {
          result <- result * i ^ (exp - 1)
          break
        }
        exp <- exp + 1
      }
      exp <- 1
    }
  }
  return(result)
}
lcm(20)

Tags: 代码in脚本truenumberforreturnif
1条回答
网友
1楼 · 发布于 2024-04-25 19:32:20

你的解决方案有两个问题。你知道吗

首先,R中的seq包含端点;Python中的range不包含端点。此外,Python中的range(2, 1)是一个空范围,而R中的seq(2, 1)产生结果2 1。因此,有必要修改Ris_prime函数以显式检查输入是否为2。你知道吗

其次,R中的is_prime函数在for循环中有return (TRUE),此时它应该在外(只有当一个数不能被任何小于它的数整除时,它才是素数)。你知道吗

这将起作用:

is_prime <- function(num) {
  if (num == 2){
    return(TRUE)
  }
  for (n in seq(2, num - 1)) {
    if (num %% n == 0) {
      return(FALSE)
    } 
  }
  return(TRUE)
}

lcm <- function(num) {
  exp <- 1
  result <- 1
  for (i in seq(2, num - 1)) {
    if (is_prime(i)) {
      while (TRUE) {
        if (i ^ exp > num) {
          result <- result * i ^ (exp - 1)
          break
        }
        exp <- exp + 1
      }
      exp <- 1
    }
  }
  return(result)
}
lcm(20)

输出:

232792560

您的代码还有其他一些奇怪的地方;例如,您不需要手动将1添加到n,您只需检查n的平方根,偶数就会立即消失。然而,这些问题更多的是效率问题,而不是正确性问题。你知道吗

相关问题 更多 >