求能整除正整數a或b的正整數序列

題目:正整數序列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


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