【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

posted @   逆火狂飙  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需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语法树
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示