黑马程序员技术交流社区

标题: 自写算法实现最简分数,例如1600:900结果是16:9 [打印本页]

作者: theape    时间: 2016-8-12 11:18
标题: 自写算法实现最简分数,例如1600:900结果是16:9
先上代码:
[Java] 纯文本查看 复制代码
import java.util.ArrayList;
import java.util.Iterator;

public class FractionSimple {

        public static void main(String[] args) {
                demo1();
                demo2();
               
        }

        private static void demo2() {
                Fraction f = new Fraction(241241242,235352);
               
                long time1 = System.nanoTime();
                for (int i=0;i<10000;i++){
                        f.simple();
                }
                long time2 = System.nanoTime();
                System.out.println(time2 - time1);
               
                time1 = System.nanoTime();
                for (int i=0;i<10000;i++){
                        f.simple2();
                }
                time2 = System.nanoTime();
                System.out.println(time2 - time1);
               
                time1 = System.nanoTime();
                for (int i=0;i<10000;i++){
                        f.simple3();
                }
                time2 = System.nanoTime();
                System.out.println(time2 - time1);
        }

        private static void demo1() {
                ArrayList<Fraction> list = new ArrayList<>();
                list.add(new Fraction(1920,1080));
                list.add(new Fraction(1600,900));
                list.add(new Fraction(1440,900));
                list.add(new Fraction(1366,768));
                list.add(new Fraction(1360,768));
                list.add(new Fraction(1280,800));
                list.add(new Fraction(1280,768));
                list.add(new Fraction(1280,720));
                list.add(new Fraction(1024,768));
                list.add(new Fraction(800,600));
               
                Iterator<Fraction> it = list.iterator();
                while (it.hasNext()) {
                        Fraction frac = it.next();
                        System.out.print(frac.numerator + " x " + frac.denominator);
                        System.out.println(" 的比例是:" + frac.simple3());
                       
                }
        }

}


class Fraction {
        int numerator;
        int denominator;
       
        Fraction (){
               
        }
       
        Fraction (int n, int d) {
                numerator = n;
                denominator = d;
        }

        public int getNumerator() {
                return numerator;
        }

        public void setNumerator(int numerator) {
                this.numerator = numerator;
        }

        public int getDenominator() {
                return denominator;
        }

        public void setDenominator(int denominator) {
                this.denominator = denominator;
        }
       
        public String simple() {
                int a = numerator;
                int b = denominator;
                int c = a >b ? b:a;  // 把 a和b 较小的数赋值给c
                int i = 1;
                while (i < c) {
                        if (a%i == 0 && b%i == 0) {
                                a = a / i;
                                b = b / i;
                                c = a < b ? a:b;
                                i = 1;
                        }
                        i++;
                }
                String str = a + " : " + b;
                return str;
        }
       
        public String simple2() {
                int a = numerator;
                int b = denominator;
                int c = a >b ? b:a;  // 把 a和b 较小的数赋值给c
                int i = c;
                while (i > 0) {
                        if (a%i == 0 && b%i == 0) {
                                a = a / i;
                                b = b / i;
                                c = a < b ? a:b;
//                                i = 1;
                        }
                        i--;
                }
                String str = a + " : " + b;
                return str;
        }
       
        public String simple3() {
                int a = numerator;
                int b = denominator;
                int max;
                int min;
                int temp;
                if (a > b){
                        max = a;
                        min = b;
                }else {
                        max = b;
                        min = a;
                }
               
                while (min!=0) {    // 循环结果max是最大公约数
                        temp = max%min;
                        max = min;
                        min = temp;
                }
               
                a = a / max;
                b = b / max;
                String str = a + " : " + b;
                return str;
        }
}





作者: theape    时间: 2016-8-12 11:28
分数 Fraction 分子 numerator 分母 numerator
方法一:a和b较小的数是c,循环从i到c,(从小到大,左右包含),分别去除以a和b
[Java] 纯文本查看 复制代码
public String simple(int a,int b) {
    int c = a >b ? b:a;  // 把 a和b 较小的数赋值给c
    int i = 1;
    while (i < c) {
        if (a%i == 0 && b%i == 0) {
            a = a / i;
            b = b / i;
            c = a < b ? a:b;
            i = 1;
        }
        i++;
    }
    String str = a + " / " + b;
    return str;
}

方法二:a和b较小的数是c,循环从c到i (从大到小,左右包含),分别去除以a和b

[Java] 纯文本查看 复制代码
public String simple2(int a,int b) {
    int c = a >b ? b:a;  // 把 a和b 较小的数赋值给c
    int i = c;
    while (i > 0) {
        if (a%i == 0 && b%i == 0) {
            a = a / i;
            b = b / i;
            c = a < b ? a:b;
        }
        i--;
    }
    String str = a + " : " + b;
    return str;
}

方法二比方法一好在只循环1次,但实际上运算时间方法二比方法一略长。这两种效率都比较低,不可取。建议用辗转相除法,简称辗除法。
方法三:用辗除法求最大公约数,然后再分别去除以a和b一次即可。

[Java] 纯文本查看 复制代码
public String simple3(int a,int b) {
    int max;
    int min;
    int temp;
    if (a > b){ // max是较大的数,min是较小的数
        max = a;
        min = b;
    }else {
        max = b;
        min = a;
    }

    while (min!=0) {    // 循环结果max是最大公约数
        temp = max%min;
        max = min;
        min = temp;
    }

    a = a / max;
    b = b / max;
    String str = a + " : " + b;
    return str;
}







作者: 橘子哥    时间: 2016-8-12 11:45
顶起来!!!
作者: zztierlie    时间: 2016-8-13 10:12
厉害吧啊啊啊啊啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2