首页 > 解决方案 > 我把一些 Python 代码转成 R 格式,但是输出不一样

问题描述

我正在研究 Project Euler 的问题 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))

代码:

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)

标签: pythonr

解决方案


您的解决方案有两个问题。

首先,seq在 R 中包括端点;range在 Python 中没有。此外,range(2, 1)在 Python 中是一个空范围,而seq(2, 1)在 R 中产生结果2 1。因此,有必要修改您的 Ris_prime函数以明确检查输入是否为 2。

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

这将起作用:

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

您的代码还有其他奇怪的地方;例如,您不需要n手动加1,您只需检查到 的平方根n,偶数立即出来。然而,这些更多的是效率问题而不是正确性问题。


推荐阅读