1. 程式人生 > 實用技巧 >CF1250E The Coronation (並查集)

CF1250E The Coronation (並查集)

1:程式碼

package javaRationalNumber;

public class RationalNumber {
	int num;
    int den;
    void setNumAndDen(int fenzi,int fenmu){
        int m=1,n=1;
        if(fenzi<0)
            m=-1*fenzi;
        if(fenmu<0)
            n=-1*fenmu;
        if(fenzi==0){
            num=0;
            den=1;
            return ;
        }              
        int c=f(m,n);//把輸入的分數進行約分
        num=fenzi/c;
        den=fenmu/c;
        if(num<0&&den<0){
            num=-num;
            den=-den;//如果分子和分母都是負的,那就轉換為正的
        }
    }
    int getNum(){
        return num;    
    }
    int getDen(){
        return den;
    }
    int f(int a,int b){
        if(a<b){
        int c=a;
        a=b;
        b=c;   
        }//轉換使運算的時候a是最大的再進行求最大公約數
     int r=a%b;
     if(r!=0)
     {
    	 return f(b,r);
     }
     return b;
    }
    RationalNumber add(RationalNumber r){//加法運算
        int a=r.getNum();
        int b=r.getDen();//得到分子分母
        int newNum=num*b+den*a;//分子等於兩數的分子都乘以對方的分母再相加
        int newDen=den*b;//分母等於兩個分母相乘
        RationalNumber result=new RationalNumber();//新的分數
        result.setNumAndDen(newNum,newDen);//再進行約分
        return result;
    }
     RationalNumber sub(RationalNumber r){//減法運算
        int a=r.getNum();
        int b=r.getDen();//得到分子分母
        int newNum=num*b-den*a;//分子等於兩數的分子都乘以對方的分母再相減
        int newDen=den*b;//分母等於兩個分母相乘
        RationalNumber result=new RationalNumber();//新的分數
        result.setNumAndDen(newNum,newDen);//再進行判斷約分
        return result;      
    }
      RationalNumber muti(RationalNumber r){//乘法運算
        int a=r.getNum();
        int b=r.getDen();//得到分子分母
        int newNum=num*a;//分子等於兩數的分子相乘
        int newDen=den*b;//分母都與兩個分母相乘
        RationalNumber result=new RationalNumber();//新的分數
        result.setNumAndDen(newNum,newDen);//再進行判斷約分
        return result;  
   
    }
       RationalNumber div(RationalNumber r){//除法運算
        int a=r.getNum();
        int b=r.getDen();//得到分子分母
        int newNum=num*b;//
        int newDen=den*a;//改為乘以倒數的形式
        RationalNumber result=new RationalNumber();//新的分數
        result.setNumAndDen(newNum,newDen);//再進行判斷約分
        return result;     
    }
}

2 測試程式碼:

public static void main(String[]args){
    	   RationalNumber r1=new RationalNumber();
    	   RationalNumber r2=new RationalNumber();//宣告兩個分數物件
           r1.setNumAndDen(4,5);
           int r1fenzi=r1.getNum();
           int r1fenmu=r1.getDen();//輸入第一個分數並化簡
           r2.setNumAndDen(4,2);
           int r2fenzi=r2.getNum();
           int r2fenmu=r2.getDen();//輸入第一個分數並化簡
           RationalNumber result=r1.add(r2);
           int resultFenzi=result.getNum();
           int resultFenmu=result.getDen();//得到結果
           System.out.printf("\n%d/%d+%d/%d=%d/%d",r1fenzi,r1fenmu,r2fenzi,r2fenmu,resultFenzi,resultFenmu);
           result=r1.sub(r2);//減法
           resultFenzi=result.getNum();
           resultFenmu=result.getDen();//得到結果
           System.out.printf("\n%d/%d-%d/%d=%d/%d",r1fenzi,r1fenmu,r2fenzi,r2fenmu,resultFenzi,resultFenmu);
           result=r1.muti(r2);//乘法
           resultFenzi=result.getNum();
           resultFenmu=result.getDen();//得到結果
           System.out.printf("\n%d/%d*%d/%d=%d/%d",r1fenzi,r1fenmu,r2fenzi,r2fenmu,resultFenzi,resultFenmu);
           result=r1.div(r2);//除法
           resultFenzi=result.getNum();
           resultFenmu=result.getDen();//得到結果
           System.out.printf("\n%d/%d/%d/%d=%d/%d",r1fenzi,r1fenmu,r2fenzi,r2fenmu,resultFenzi,resultFenmu);
    
       }

3 執行結果:

4:嘗試描述怎麼與c語言的有理數程式碼相比較,為什麼你設計的類更加面向物件?

c語言的使用依賴於許多自己設定的引數,並不方便直接使用,java程式碼則只需要對class進行呼叫,輸入資料就可以使用,更面向物件。

5:嘗試從程式碼複用的角度來描述你設計的有理數類。從幾個方面討論。

  • a:在新類中建立RationalNumber類的物件,通過物件來呼叫類中非private的屬性和方法。

  • b:依賴我的有理數類,修改我的有理數的屬性對他人呼叫也有影響

  • c:設定為private是為了保護有些方法裡的特殊賦值設為隱藏不被發現,從而不會被輕易修改,影響方法的正常計算。