Ruby求解N1到N2闭区间内可被N3整除数的统计输出问题
Ruby实现闭区间内查找指定除数整除数的方案
核心逻辑
- 先做基础合法性校验:除数N3不能为0,否则会触发除零报错;如果输入的区间左端点N1大于右端点N2,自动交换两个值保证区间有效,避免漏算
- 可被N3整除的判定规则:整数对N3取模结果为0,Ruby中用
%运算符完成取模计算 - 筛选完成后逐行打印符合条件的数值,最后统计总数输出
基础实现代码
这个版本写法直观,适合区间范围不大的场景:
def get_divisible_numbers(n1, n2, n3) # 校验除数合法性 raise ArgumentError, "N3不能为0" if n3.zero? # 修正区间顺序 range_start, range_end = [n1, n2].minmax # 筛选符合条件的数 matched_nums = (range_start..range_end).select { |num| num % n3 == 0 } # 按要求输出 puts "符合条件的数值:" matched_nums.each { |num| puts num } puts "符合条件的数值总个数:#{matched_nums.length}" matched_nums end # 调用示例:查找1-20区间内可被3整除的数 get_divisible_numbers(1, 20, 3)
示例运行输出
符合条件的数值: 3 6 9 12 15 18 符合条件的数值总个数:6
大区间优化版本
如果N1和N2差值达到百万、千万量级,逐个遍历区间判断效率很低,可以直接通过数学计算定位第一个符合条件的数,再按N3为步长生成所有结果,不需要遍历整个区间:
def get_divisible_numbers_fast(n1, n2, n3) raise ArgumentError, "N3不能为0" if n3.zero? range_start, range_end = [n1, n2].minmax # 计算区间内第一个可被n3整除的数 first_match = range_start + (n3 - range_start % n3) % n3 if first_match > range_end puts "无符合条件的数值" puts "符合条件的数值总个数:0" return [] end # 按步长直接生成所有符合条件的数 matched_nums = (first_match..range_end).step(n3).to_a puts "符合条件的数值:" matched_nums.each { |num| puts num } puts "符合条件的数值总个数:#{matched_nums.length}" matched_nums end
内容的提问来源于stack exchange,提问作者Nishant Chauhan
相关产品推荐
相关产品推荐

