欧拉工程第33题:Digit cancelling fractions

题目链接:https://projecteuler.net/thread=33
对两位数字,求满足一定条件的数的乘积
1 ab/bc=a/c
2 ab/cb=a/c
3 ba/bc=a/c
4 ba/cb=a/c

给的例子是满足1的,而且还只有四个数,求这四个分数的乘积,最简后的分母是什么?

给的例子满足2的,不符合条件

感觉上,应该没有满足3的两位数,

4 应该满足条件的

a范围 1,9
b范围1,9
c范围2,9

还有就是三个数不能相等。

注意需要约分的。
java代码:

package projecteuler31to40;

import java.util.Date;

class level33{
    void solve(){
        int A=1;
        int B=1;
        int Z;
        int M;
        for(int a=1;a<=9;a++){
            for(int b=1;b<=9;b++){
                for(int c=2;c<=9;c++){
                    Z=a*10+b;
                    M=b*10+c;
                    if(Z*c==M*a && a!=b && a<c){
                        A=A*a;
                        B=B*c;
                        System.out.println(Z+"/"+M+" = "+a+"/"+c);
                    }

                    Z=b*10+a;
                    M=c*10+b;
                    if(Z*c==M*a && a!=b && a<c){
                        A=A*a;
                        B=B*c;
                        System.out.println(Z+"/"+M+" = "+a+"/"+c);
                    }

                }
            }
        }
        System.out.println(A+" "+B);
        int res=B/gcd(A,B);
        System.out.println(res);
    }
    int gcd(int a,int b){
        if(a<b){
            int temp=a;a=b;b=temp;
        }
        int r;
        while(b!=0){
            r=a%b;
            a=b;
            b=r;
        }
        return a;
    }
}
public class Problem33 {

    public static void main(String[] args){
        Date beginTime=new Date();
        new level33().solve();
        Date endTime=new Date();
        Long Time=endTime.getTime()-beginTime.getTime();
        System.out.println("Time="+Time/1000+"秒"+Time%1000+"毫秒");
    }
}

结果只有下面四个,只是满足1的数:

16/64 = 1/4 19/95 = 1/5 26/65 = 2/5 49/98 = 4/8

Python代码:

def gcd(a,b):
    if a<b:
        temp=a
        a=b
        b=temp
    r=0;
    while b!=0:
        r=a%b
        a=b
        b=r
    return a

def solve():
    res1=1
    res2=1
    for a in range(1,10):
        for b in range(1,10):
            for c in range(2,10):
                 z=a*10+b
                 m=b*10+c
                 if z*c==m*a and a!=b and a<c:
                     res1=res1*a
                     res2=res2*c
                     print z,m,a,c
    print res2/gcd(res1,res2)

你可能感兴趣的:(java,python,最大公约数,欧拉工程)