題目:正整數序列Q中的每個元素都至少能被正整數a和b中的一個整除,現給定a和b,需要計算出Q中的前幾項,例如,當a=3,b=5,N=6時,序列為3,5,6,9,10,12
(1)設計一個函數void generate(int a, int b, int N, int * Q)計算Q的前N項
(2)設計測試資料來驗證函式程式在各種輸入下的正確性
最簡單的想法就是,從1開始挨個驗證,能否被a或b整除,直到找到N項為止。但是這個方法如果a和b很大,那麼就要遍曆很多數字,而且模運算也比較耗時。
實現代碼如下:
void generate(int a, int b, int N, int * Q){if(a <= 0 || b <= 0 || N < 0 || Q == NULL)throw new exception("Invalid input!");int cnt = 0;int i = 1;while(cnt < N){if(i % a == 0 || i % b == 0)Q[cnt++] = i;i++;}return;}
最佳化思路,我們只需要從小到大輸出a的倍數或b的倍數就行,使用兩個變數x和y,x從a開始以a為步長增長,y從b開始以b為步長增長,每次輸出較小者且較小者按照相應步長增長,當x==y時,同時增長。
實現代碼如下:
void generate(int a, int b, int N, int * Q){if(a <= 0 || b <= 0 || N < 0 || Q == NULL)throw new exception("Invalid input!");int cnt = 0;int x = a;int y = b;while(cnt < N){if(x == y){Q[cnt++] = x;x += a;y += b;}else if(x < y){Q[cnt++] = x;x += a;}else{Q[cnt++] = y;y += b;}}return;}
測試資料如:
a = 1, b = 2
a = 2, b = 1
a = 0, b = -1
a = 3, b = 5
a = 5, b = 3
a = 7, b = 7
a = 9997, b = 13337
a = 13337, b = 9997