CF1250E The Coronation (並查集)
阿新 • • 發佈:2020-10-04
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是為了保護有些方法裡的特殊賦值設為隱藏不被發現,從而不會被輕易修改,影響方法的正常計算。