(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