python - 我把一些 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)
解决方案
您的解决方案有两个问题。
首先,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
,偶数立即出来。然而,这些更多的是效率问题而不是正确性问题。
推荐阅读
- android - @gorhom/react-native-bottom-sheet 不适用于 Android
- php - PHP从两个数组中添加值
- node.js - 使用 unlink() 删除后无法提供文件
- c# - Nest - 搜索路径
- javascript - Javascript ajax django 地理位置查询
- javascript - JavaScript显示复选框onclick但第一次不起作用
- azure - 有没有办法从 Azure 位置 REST API 只获取“有效”位置?
- python - 比较或比较两个熊猫列元素明智
- javascript - 使用数据库中的数据填充空网格列
- hadoop - 从 python 文件创建配置单元表并使用 spark-submit 运行它失败