C++整數類的設計及註解

Question:

將整數設計爲一個類,將整數相關的常見數學運算設計爲類的接口並進行實現,如求與給定值的最大公約數、最小公倍數、枚舉所有因子等。

Answer & Code:

#include "math.h"
#include "vector"
using std::vector;

/定義自然數類
class NaturalNumber{
public:
NaturalNumber(unsigned long int n=0):num(n){} 

//該部分分爲兩部分:

//NaturalNumber(unsigned long int n=0)    //定義非默認構造函數

//                                                     :num(n){}   // 對數據成員進行初始化(num位於private中)


unsigned long int GreatestCommonDivisor(NaturalNumber & nn);//求解最大公約數 
unsigned long int LeaseCommonMultiple(NaturalNumber & nn);//求解最小公約數

// NaturalNumber & nn 意爲: NaturalNumber引用名爲nn,即之後nn就代表NaturalNumber


int GetFactors(vector <unsigned long int> & factors); //求所有因子,存儲在
factors中,函數返回因子個數
unsigned long int GetNumber(){return num;}
//……其它外部接口
private:
unsigned long int EUCLID(NaturalNumber & n); //歐幾里德算法求解最大公約數
unsigned long int num; //存儲真正的自然數
};
//返回歐幾里德算法求解最大公約數
unsigned long int NaturalNumber :: EUCLID(NaturalNumber & nn)
{
unsigned long int m = num;
unsigned long int n = nn.num;      //即nn.num=NaturalNumber.num 
unsigned long int r = m % n;
while (r != 0){
m = n; n = r; r = m % n;
}
return n;
}
//返回最大公約數
unsigned long int NaturalNumber :: GreatestCommonDivisor(NaturalNumber & nn)
{
return EUCLID(nn);
}
//返回最小公倍數
unsigned long int NaturalNumber :: LeaseCommonMultiple(NaturalNumber & nn)
{
unsigned long int temp = EUCLID(nn);
return num * nn.GetNumber() / temp;
}
int NaturalNumber :: GetFactors( vector <unsigned long int> & factors )
{
int t=0;
int m = sqrt((double)num);
vector <unsigned long int> bigfactors;
for (unsigned long int i=1;i<m;i++)
{
if ( 0 == num%i ) {t+=2; factors.push_back(i);bigfactors.push_back(num/i);}
}
if ( m*m == num ) { t++; factors.push_back(m);}
vector <unsigned long int> ::iterator it=bigfactors.end();
if (bigfactors.size()) do
{
it--;
factors.push_back(*it);
}while (it!=bigfactors.begin());
return t;
}
void main()
{
NaturalNumber p(1);
int xx = p.GreatestCommonDivisor(NaturalNumber(120));
int yy = p.LeaseCommonMultiple(NaturalNumber(120));
vector <unsigned long int> f;
int t = p.GetFactors(f);
}

Analysis & Code Annotation:

//定義自然數類
class NaturalNumber{
public:
NaturalNumber(unsigned long int n=0):num(n){} 

//該部分分爲兩部分:

//NaturalNumber(unsigned long int n=0)    //定義非默認構造函數

//                                                    :num(n){}  // 對數據成員進行初始化(num的定義在後面)

unsigned long int GreatestCommonDivisor(NaturalNumber & nn);//求解最大公約數 
unsigned long int LeaseCommonMultiple(NaturalNumber & nn);//求解最小公約數

// NaturalNumber & nn 意爲:NaturalNumber引用名爲nn,即之後nn就代表NaturalNumber

int GetFactors(vector <unsigned long int> & factors); //求所有因子,存儲在factors中,函數返回因子個數
unsigned long int GetNumber(){return num;}//……其它外部接口
private:
unsigned long int EUCLID(NaturalNumber & n); //歐幾里德算法求解最大公約數
unsigned long int num; //存儲真正的自然數
};
//返回歐幾里德算法求解最大公約數
unsigned long int NaturalNumber :: EUCLID(NaturalNumber & nn){
unsigned long int m = num;
unsigned long int n = nn.num; 

//即nn.num=NaturalNumber.num 

unsigned long int r = m % n;
while (r != 0){
m = n; n = r; r = m % n;
}

。。。

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章