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

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.