【Java/math】已知三角形周长C,三边长均为整数,列举出满足条件的直角三角形直角边a和b,斜边c.(包括入门篇和进阶篇)
下面提供了两份代码,进阶篇的效率几乎比入门篇提高一个数量级。
提高效率的根源在于将b转换为周长C和a的函数,因此用一重循环就解决了问题。
这种通过改变算法提高效率的方式值得推崇。
入门篇:
package test221201; import java.util.Set; import java.util.TreeSet; /** * 设三角形的周长=120,满足该周长,且每条边均为整数的直角三角形,有以下三个: * a=20 b=48 c=52 * a=24 b=45 c=51 * a=30 b=40 c=50 * 现给定三角形周长C,求满足条件的直角三角形 * 入门篇,迈出第一步,可解决从无到有的问题 */ public class Test { public static void main(String[] args) { final int C=100000; // 放置三边的集合 Set<Gougu> set=new TreeSet<>(); for(int a=1;a<C/2;a++) { for(int b=1;b<C/2;b++) { int c=C-a-b; if(a+b<c || a+c<b || b+c<a) { // 不满足三角形的剔除 continue; } if(isRtTriangle(a,b,c)) { // 满足直角三角形的加入集合 set.add(new Gougu(a,b,c)); } } } // 输出 for(Gougu g:set) { System.out.println(g); } } /** * 判断输入的三个值是否满足直角三角形的三边 * @param a 直角边 * @param b 直角边 * @param c 斜边 * @return 是否满足a^2+b^2=c^2 */ private static boolean isRtTriangle(long a,long b,long c) { return (a*a+b*b)==c*c; } // 静态内部类作为集合中之单元 static class Gougu implements Comparable<Gougu>{ int a; int b; int c; public Gougu(int a,int b,int c) { this.a=a; this.b=b; this.c=c; } @Override public String toString() { return "a="+a+" b="+b+" c="+c; } @Override public boolean equals(Object o) { if(this==o) { return true; } if(o==null || this.getClass()!=o.getClass()) { return false; } Gougu other=(Gougu)o; return this.a*this.b==other.a*other.b; } @Override public int hashCode() { return a*b; } @Override public int compareTo(Gougu o) { return this.hashCode()-(o.hashCode()); } } }
输出:
a=20000 b=37500 c=42500
a=21875 b=36000 c=42125
进阶篇:
package test221201; import java.util.Set; import java.util.TreeSet; /** * 设三角形的周长=120,满足该周长,且每条边均为整数的直角三角形,有以下三个: * a=20 b=48 c=52 * a=24 b=45 c=51 * a=30 b=40 c=50 * 现给定三角形周长C,求满足条件的直角三角形 * 进阶篇,通过因式分解,将b转化成C与a的函数,从而大大提高了效率 */ public class Test2 { public static void main(String[] args) { final int C=100000; // 放置三边的集合 Set<Gougu> set=new TreeSet<>(); for(int a=1;a<C/3;a++) { double b = C - (double)C*C/(2*C - 2*a); if(a<b && b - (int)b < 1e-5) { int bb=(int)b; int c=C-a-bb; set.add(new Gougu(a,bb,c)); } } // 输出 for(Gougu g:set) { System.out.println(g); } } static class Gougu implements Comparable<Gougu>{ int a; int b; int c; public Gougu(int a,int b,int c) { this.a=a; this.b=b; this.c=c; } @Override public String toString() { return "a="+a+" b="+b+" c="+c; } @Override public boolean equals(Object o) { if(this==o) { return true; } if(o==null || this.getClass()!=o.getClass()) { return false; } Gougu other=(Gougu)o; return this.a*this.b==other.a*other.b; } @Override public int hashCode() { return a*b; } @Override public int compareTo(Gougu o) { return this.hashCode()-(o.hashCode()); } } }
输出:
a=20000 b=37500 c=42500
a=21875 b=36000 c=42125
END
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2019-12-01 【Json】Json分词器
2019-12-01 【java/Json】用Java对象构建Json语法树