Java实现指定逻辑求助:根据j值匹配对应区间的已过i值
Java实现三角数区间匹配逻辑
你需要处理的j值是三角数,对应关系为第i个三角数 j = 1+2+...+i = i*(i+1)/2。需求是输入任意j值,返回最大的i,使得第i个三角数≤输入j(若j处于两个三角数之间,返回前一个对应的i)。
方法一:迭代动态计算
不需要硬编码所有i-j对,通过动态迭代计算j值,直到超过输入值,即可得到目标i。逻辑直观,支持任意大小的输入j。
import java.util.Scanner; public class TriangularNumberMatcher { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter j value: "); int inputJ = scanner.nextInt(); int currentI = 0; int currentJ = 0; int resultI = 0; // 迭代计算直到currentJ超过输入值,记录前一个合法的i while (currentJ <= inputJ) { resultI = currentI; currentI++; currentJ += currentI; } System.out.println("The corresponding i value for j = " + inputJ + " is " + resultI); scanner.close(); } }
示例说明:输入39时,currentJ会依次计算为1、3、6、10、15、21、28、36、45,当currentJ=45超过39时,resultI停留在8,即为正确结果。若输入精确三角数(如36),循环会在currentJ=36时记录resultI=8,随后迭代到currentJ=45退出,返回正确值。
方法二:数学公式法
利用三角数的数学公式反向推导,无需循环,效率更高,适合处理大数值输入。
已知三角数公式 j = i*(i+1)/2,变形为二次方程 i² + i - 2j = 0,通过求根公式可得:i = [-1 + √(1+8j)]/2
取该值的整数部分(向下取整),即为目标i。
import java.util.Scanner; public class TriangularNumberMatcher { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter j value: "); int inputJ = scanner.nextInt(); // 计算判别式,用long避免整数溢出 long discriminant = 1 + 8L * inputJ; double sqrtDiscriminant = Math.sqrt(discriminant); double iValue = (-1 + sqrtDiscriminant) / 2; // 向下取整得到结果 int resultI = (int) Math.floor(iValue); System.out.println("The corresponding i value for j = " + inputJ + " is " + resultI); scanner.close(); } }
示例说明:输入39时,判别式=1+8×39=313,平方根≈17.69,计算得iValue≈8.34,向下取整为8;输入36时,判别式=289,平方根=17,计算得iValue=8,直接返回正确结果。
原硬编码方法的问题
硬编码的列表仅能处理预先定义的精确匹配,无法覆盖区间场景,且输入j超过列表最大值时会返回错误结果,扩展性极差。上述两种方法完全解决了这些问题,支持所有合法正整数j的输入。
内容的提问来源于stack exchange,提问作者Kraken
相关产品推荐
相关产品推荐

