欧拉工程第39题:Integer right triangles

题目链接:https://projecteuler.net/problem=39

给出周长,满足这个周长的直角三角形有多少个,三边都是整数
题目要求的是周长小于1000时候的,所组成的直角三角形个数最多的那个周长

怎么感觉最近的几个题目都比较简单了呢?

a*a+b*b=c*c
a+b+c=s

根据这个方程 可以得出 a b s 的关系式,三个for循环即可

既然得出了a b s 的关系式,可以进一步解出a或b
b=(s*s-2*s*a)/(2*s-2*a)

注意:还要加条件
int b1=(s*s-2*s*a)/(2*s-2*a);
int b2=(s*s-2*s*a)%(2*s-2*a);

b2要等于零,这个很显然,还有就是b1要大于零,还有就是 b1>=a

加了上面条件结果就对了,当然都不加的话,结果也是一样的,只能说是巧合

b1>=a 是为了防止出现 3 4 5 , 4 3 5的情况

Java代码:

package projecteuler31to40;

import java.util.Date;
import java.util.Set;
import java.util.TreeSet;

class level39{

    void solve2(){
        int Max_Value=1000;
        int result=0;
        int maxs=0;
        for(int s=12;s<Max_Value;s++){
            int num=0;
            for(int a=3;a<=s-1;a++){
                int b1=(s*s-2*s*a)/(2*s-2*a);
                int b2=(s*s-2*s*a)%(2*s-2*a);
                if(b2==0 && b1>0 && (b1>=a) ){//&& a*a+b1*b1==(s-a-b1)*(s-a-b1)){
                    num+=1;
//                  if(s==840)
//                  System.out.println(a+","+b1+","+(s-a-b1));
                }
            }
            if(num>result) {
                result=num;
                maxs=s;
            }
        }
        System.out.println(result+","+maxs);
    }
    void solve(){
        int Max_Value=1000;
        int result=0;
        int maxs=0;
        for(int s=12;s<Max_Value;s++){
            int num=0;
            for(int a=3;a<=s-1;a++){
                for(int b=a;b<=s;b++){

                    if(s*s+2*a*b==2*s*a+2*s*b){
                        num+=1;
                    }
                }
            }
            if(num>result) {
                result=num;
                maxs=s;
            }
        }
        System.out.println(result+","+maxs);
    }

}
public class Problem39 {


    public static void main(String[] args){
        Date beginTime=new Date();
        new level39().solve2();
        Date endTime=new Date();
        long Time=endTime.getTime()-beginTime.getTime();
        System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms");
    }

}

结果:

8,840
Time:0s9ms

复制一个Python代码:

perimeter = 0
no_of_solutions = 0

for p in range(4, 1001, 2):
    counter = 0

    for a in range (1, int(p/3)):
        numerator_of_b = p*p - 2*a*p
        denominator_of_b = 2*(p - a)
        if numerator_of_b % denominator_of_b == 0 and a < int(numerator_of_b/denominator_of_b):
            counter += 1

    if counter > no_of_solutions:
        no_of_solutions = counter
        perimeter = p

print ("perimeter =", perimeter, "with", no_of_solutions, "solutions.")

结果:

('perimeter =', 840, 'with', 8, 'solutions.')

你可能感兴趣的:(java,python,欧拉工程)