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;
}
。。。
}