如何用R语言找出满足固定比值与求和限制的正整数组合
求解满足指定比值与总和上限的正整数组合(R语言实现)
问题描述
找出所有正整数组合(V1, V2),需满足:
- V1与V2的比值等于指定值
rat - 两者之和不超过指定上限
tot_max(小于上限也符合要求)
示例(rat=0.5,tot_max=16):
V1 V2 ratio(V1/V2) sum status 1 2 0.5 3 OK 2 4 0.5 6 OK 3 6 0.5 9 OK 4 8 0.5 12 OK 8 16 0.5 24 NOT OK (over 16)
适配任意参数的R代码
find_valid_pairs <- function(tot_max, rat) { # 将比值转换为最简分数,避免浮点数精度问题 rat_frac <- MASS::fractions(rat) num <- as.integer(rat_frac@num) den <- as.integer(rat_frac@den) # 计算最大正整数k,确保k*(num+den) ≤ tot_max max_k <- floor(tot_max / (num + den)) # 处理无符合条件组合的情况 if (max_k < 1) { return(data.frame(V1 = integer(), V2 = integer(), ratio = numeric(), sum = integer(), status = character())) } # 生成所有有效组合 k_values <- 1:max_k V1 <- num * k_values V2 <- den * k_values ratio <- V1 / V2 sum_vals <- V1 + V2 status <- ifelse(sum_vals <= tot_max, "OK", "NOT OK (over tot_max)") # 整理为结构化数据返回 result <- data.frame(V1, V2, ratio, sum = sum_vals, status) return(result) } # 测试示例参数 find_valid_pairs(tot_max = 16, rat = 0.5)
代码说明
- 分数转换:借助
MASS::fractions()将比值转为最简分数形式,避免浮点数精度误差(比如0.1这类循环小数的计算偏差)。 - 最大k值推导:由于V1=numk、V2=denk(num/den为最简比值),总和为k*(num+den),通过
floor(tot_max/(num+den))得到最大有效正整数k。 - 组合生成:基于k的范围批量生成V1、V2,同步计算比值、总和及状态,最终返回结构化数据框。
- 边界处理:当tot_max小于num+den时,直接返回空数据框,避免无效计算。
测试结果
运行示例代码会输出:
V1 V2 ratio sum status 1 1 2 0.5 3 OK 2 2 4 0.5 6 OK 3 3 6 0.5 9 OK 4 4 8 0.5 12 OK
内容的提问来源于stack exchange,提问作者neversaint
相关产品推荐
相关产品推荐

