一.題目要求:求n個數的最大公約數和最小公倍數
二.題目背景
anks博士是bt(bio-tech,生物技術)領域的知名專家,他的兒子名叫hankson。現在,剛剛放學回家的hankson正在思考乙個有趣的問題。
今天在課堂上,老師講解了如何求兩個正整數c1和c2的最大公約數和最小公倍數。現在hankson認為自己已經熟練地掌握了這些知識,他開始思考乙個「求公約數」和「求公倍數」之類問題的「逆問題」,這個問題是這樣的:已知正整數a0,a1,b0,b1,設某未知正整數x滿足:
1、 x和a0的最大公約數是a1;
2、 x和b0的最小公倍數是b1。
hankson的「逆問題」就是求出滿足條件的正整數x。但稍加思索之後,他發現這樣的x並不唯一,甚至可能不存在。因此他轉而開始考慮如何求解滿足條件的x的個數。請你幫助他程式設計求解這個問題。
輸入格式
輸入第一行為乙個正整數n,表示有n組輸入資料。接下來的n行每行一組輸入資料,為四個正整數a0,a1,b0,b1,每兩個整數之間用乙個空格隔開。輸入資料保證a0能被a1整除,b1能被b0整除。
輸出格式
輸出共n行。每組輸入資料的輸出結果佔一行,為乙個整數。
對於每組資料:若不存在這樣的x,請輸出0;
若存在這樣的x,請輸出滿足條件的x的個數;
樣例輸入
241 1 96 288
95 1 37 1776
樣例輸出62
三.設計思路
背景中所給的輸入情況有兩種,第一種輸入的是組數,第二種輸入的是要計算的資料,因為題目給出要輸入的資料只有四個,a0,a1,b0,b1,而要輸入的組數是個未知數,所以我的想法是定義兩個未知大小的二維陣列,乙個負責計算,乙個負責備份,分別儲存組數和資料,我定義乙個x在10000之內,再通過乙個輾轉相除法分別計算未知x與資料中兩兩組合的最大公因數和最小公倍數,輸出存在x的個數。
四.整體**
#include #include #include #include void jisuan(int **a,int **b)
} jisuan(a,b);
}
五.除錯,測試。
六.總結
剛開始瀏覽這道題的時候不知道該怎麼下手,題目可以理解就是不知道用什麼方法來完善**,但還是通過定義乙個二維陣列解決了問題。
開始時,最大的問題是不知道怎麼定義乙個未知大小的二維陣列,因為後面的演算法不是很難設計,最重要的是該如何來儲存這些數字,通過網上的知識才學習到了。
定義未知大小二維陣列的方法
cin>>m>>n;
int **a,i;
a=new int *[m];
for(i=0;i
此時就可以完成定義乙個未知大小的二維陣列。
後面在寫演算法時遇到的問題是一直陷入死迴圈,因為整段**都在經歷變數之間的數值相互轉換,每轉換一次都必須要將那個變數返回初值才可以進行下乙個迴圈,所以我同時設定了多個變數,爭取每個資料都儲存在兩個不同的變數中。
現在還存在的問題是,我給定的x的範圍是1~10000之間,也就是這個x是有範圍的,如果輸入的數字過大,那麼可以輸出x的個數可能就不是那麼準確。
求最大公因數和最小公倍數
利用更相減損術與輾轉相除法來實現求最大公因數與最小公倍數的功能。如下 博主入門不久,還請神犇們多指教 include include using namespace std int number1,number2,number3,number4,answer void change 自定義函式,用於...
C C 求最大公因數 和 最小公倍數
include stdafx.h include using namespace std 求最大公因數 輾轉相除法 有兩整數a和b 1.a b得餘數c 2.若c 0,則b即為兩數的最大公約數 3.若c 0,則a b,b c,再回去執行1 int findmaxcommonfactor divisio...
最大公因數和最小公倍數函式模板
int jude int a,int b 實現了函式無需比較大小來求最大公因數 最大公約運用簡單的遞迴方法 運用了數學方法 最小公倍數實在最大公約數函式的基礎上實現,運用了上述函式所得的最大公約數,即可以直接呼叫函式的結果進行運算,簡單方便直接 運用的主要數學原理是 最小共倍數 兩個數的乘積 最大公...