如何用R语言编写脚本计算100以内素数 数值小于2时返回false
原有代码问题梳理
- 缺失输入边界校验:没有先判断输入值是否小于2,不满足需求要求的输入小于2返回
false的规则 - return 放置位置错误:循环内第一轮到
i=2时就会执行return(pnums)直接终止函数,后续所有逻辑都不会运行,只会返回[1] 2 - 素数判断逻辑完全失效:首先仅判断模2不等于0不能判定是素数(比如9模2不等于0但不是素数),其次判断模2的代码放在了
return(pnums)之后,永远不会被执行 - 逻辑冲突:函数同时存在返回素数向量和返回布尔值的逻辑,没有做场景区分,运行逻辑混乱
正确实现方案
以下代码完全匹配需求:输入数字若小于2返回FALSE,输入≥2时返回所有小于等于输入值的素数向量,逻辑直白适合新手理解:
prime_numbers <- function(x) { # 输入边界校验:小于2直接返回FALSE if (x < 2) { return(FALSE) } # 初始化存储素数的空向量 pnums <- c() # 遍历所有2到x的待判断数字 for (n in 2:x) { is_prime <- TRUE # 素数判断规则:只要n能被2到平方根(n)之间的任意整数整除,就不是素数 for (i in 2:sqrt(n)) { if (n %% i == 0) { is_prime <- FALSE break # 找到因数后直接跳出内层循环,减少无效运算 } } # 确认是素数后加入结果向量 if (is_prime) { pnums <- c(pnums, n) } } return(pnums) } # 测试调用 # 输入小于2的情况 prime_numbers(1) # 返回 FALSE # 输出10以内素数 prime_numbers(10) # 返回 2 3 5 7 # 输出100以内素数 prime_numbers(100)
如果需要处理更大的数值,可改用埃拉托斯特尼筛法提升效率,上述实现对于100以内素数筛选的性能完全够用。
内容的提问来源于stack exchange,提问作者b14108
相关产品推荐
相关产品推荐

