如何用R语言的循环求解方程x+xy+y=54(x、y为正整数)
求解方程x+xy+y=54(正整数解)并实现R代码
数学推导
先对原方程变形:
x + xy + y = 54
两边加1后因式分解:
(x+1)(y+1) = 55
55的正整数因数对为(1,55)、(5,11)、(11,5)、(55,1)。由于x、y是正整数,x+1和y+1都必须≥2,因此排除(1,55)和(55,1)两组,剩下有效解:
x+1=5,y+1=11→ x=4,y=10,x+y=14x+1=11,y+1=5→ x=10,y=4,x+y=14
最终x+y的固定值为14。
R代码实现
方法1:暴力枚举(新手友好,for循环)
直接遍历x的可能范围,计算对应y是否为正整数:
solutions <- list() # x的最大可能值:当y=1时,x+x+1=54 → x≤26.5,所以遍历1到26即可 for (x in 1:26) { y <- (54 - x) / (1 + x) # 判断y是否为正整数 if (y > 0 && y == as.integer(y)) { solutions[[length(solutions)+1]] <- list(x = x, y = y, x_plus_y = x + y) } } print(solutions)
方法2:基于因数分解(更高效)
利用方程变形后的因数关系直接计算:
# 找出55的所有正因数 factors <- which(55 %% 1:55 == 0) # 筛选出≥2的因数(对应x+1的有效取值) valid_factors <- factors[factors > 1] solutions <- lapply(valid_factors, function(f) { f2 <- 55 / f if (f2 > 1) { x <- f - 1 y <- f2 - 1 list(x = x, y = y, x_plus_y = x + y) } }) # 过滤空值并输出 solutions <- Filter(Negate(is.null), solutions) print(solutions)
关于while循环的说明
while循环确实可以实现,但对于这个问题来说,for循环逻辑更清晰,无需额外维护终止条件。示例写法如下:
x <- 1 solutions <- list() while (x <= 26) { y <- (54 - x)/(1 + x) if (y > 0 && y == as.integer(y)) { solutions[[length(solutions)+1]] <- list(x=x, y=y, x_plus_y=x+y) } x <- x + 1 } print(solutions)
由于问题规模极小,三种方法的效率差异可以忽略,新手优先选择for循环即可。
内容的提问来源于stack exchange,提问作者mauri
相关产品推荐
相关产品推荐

