JacK_C#_类在分数上的运用

来源:互联网 发布:java 兼职 编辑:程序博客网 时间:2024/06/08 06:50
#region 分数
//定义分数(Fraction)类:    
//(1)成员变量
//    私有字段以及可读可写属性:分子、分母
//(2)成员方法:
//        * 打印分数信息(例如: 1 / 3)
//        * 约分
//        * 创建一个方法交换分子和分母的值
//        * 创建一个方法能同时得到加、减、乘、除、求余运算;

    class Fraction{
        private int numerator;
        private int denominator;

        public int Numerator{
            get{ 
                return numerator;
            }
            set{
                if (value == 0) {
                    throw new FormatException ("格式异常,分母不能为零");
                } else {
                    numerator = value;
                }
            }
        }
        public int Denominator{
            get{ 
                return denominator;
            }
            set{ 
                denominator = value;
            }
        }

//打印分数信息
        public void Print(){
            Console.WriteLine ("{0} / {1}",Numerator,Denominator);
        }
            
//求最大公约数      最大公倍数Numerator * Denominator / gsd
        public int GCD(){
//            方法一:辗转相除法,最常用的算法
            int a = Numerator,= Denominator;
            while (b != 0) {
                int c = a % b;
                a = b;
                b = c;
            }
            return a;
        }
            //方法二:
//            int min = Numerator < Denominator ? Numerator : Denominator;
//            int max = Numerator > Denominator ? Numerator : Denominator;
//            if (max % min == 0) {                    //  该条件也是为下面节省空间而衍生的
//                return min;
//            }
//            int gcd = 0;
//            for (int i = 1; i <= min / 2 ; i++) {    //   min/2节省了运行时间和空间
//                if (Numerator % i == 0 && Denominator % i == 0) {
//                    gcd = i; 
//                }
//            }
//            return gcd;



//约分
        public void Reduce(){
            //方法1:
//            for (int i = (Numerator < Denominator ? Numerator : Denominator); i > 1;i--) {
//                if (Numerator % i == 0 && Denominator % i == 0) {
//                    Numerator /= i;
//                    Denominator /= i;
//                }
//            }
//            Print ();
            //方法二:
            Numerator /= GCD();
            Denominator /= GCD();
            Print ();
        }

//交换分子分母
        public void Swap(){
            int temp = Numerator;
            Numerator = Denominator;
            Denominator = temp;
        }

//包含基本运算符
        public void MathOperation(Fraction fraction,out Fraction addResult,out Fraction redResult,out Fraction mulResult,out Fraction divResult,out Fraction remResult){
            //加法
            addResult = new Fraction();
            addResult.Denominator = fraction.Denominator * Denominator;
            addResult.Numerator = fraction.Denominator * Numerator + fraction.Numerator * Denominator;
            addResult.Reduce ();
            //减法
            redResult = new Fraction();
            redResult.Denominator = fraction.Denominator * Denominator;
            redResult.Numerator = fraction.Denominator * Numerator - fraction.Numerator * Denominator;
            redResult.Reduce ();
            //乘法
            mulResult = new Fraction();
            mulResult.Denominator = fraction.Denominator * Denominator;
            mulResult.Numerator = fraction. Numerator * Numerator;
            mulResult.Reduce ();
            //除法
            divResult = new Fraction();
            divResult.Denominator = fraction.Denominator * Numerator;
            divResult.Numerator = fraction. Numerator * Denominator;
            divResult.Reduce ();
            //求余
            remResult = new Fraction();
            remResult.Denominator = fraction.Denominator * Denominator;
            remResult.Numerator = (fraction.Denominator * Numerator) % (fraction.Numerator * Denominator);
            remResult.Reduce ();
        }
    }
    #endregion