一道百度之星程式設計大賽題的隨筆聯想 (1)

2022-02-09 14:20:53 字數 2273 閱讀 8017

鄙人雖然是乙個.net程式設計師,在工作之餘,喜愛演算法。 我覺得這個題目有點意思,故而分享給大家,我想到兩種方法,提供大家,希望對大家起了乙個開闊思路的作用。

首先,看題目是那樣的:

請編寫程式,根據輸入的任何乙個正整數,找出符合這種要求的所有連續正整數序列。

輸入資料:乙個正整數,以命令列引數的形式提供給程式。

輸出資料:在標準輸出上列印出符合題目描述的全部正整數序列,每行乙個序列,每個序列都從該序列的最小正整數開始、以從小到大的順序列印。如果結果有多個序列,按各序列的最小正整數的大小從小到大列印各序列。此外,序列不允許重複,序列內的整數用乙個空格分隔。如果沒有符合要求的序列,輸出「none」。

例如,對於15,其輸d出結果是:

1 2 3 4 5

4 5 6

7 8對於16,其輸出結果是:

none

我這裡提供2種演算法的解法,起乙個拋磚引玉的作用

方法一:可以從後往前的計算,由大到小的計算。這種計算模式有幾個思考的步驟。

①由於使 計算嗎,我可以考慮從輸入的數字的一半(奇數使其中間數)開始遍歷。於是我就有這樣一種演算法。相應偽**如圖所示:

相應的源**如下:

1        console.writeline("

請你輸入乙個數字");

2int mi = int

.parse(console.readline());

3int temp =mi;4//

是否能夠拆成n個連續的數字的表計量

5bool find = false;6

int temp1 = 0;7

//記錄最終的結果

8 list strs = new list(); 9//

憑藉成最終的字串

10string tempstr = string

.empty;

11//

進行迴圈拆解

12for (int i = (mi - 1) / 2 + 1; i >= 1; i--)

132829}

30//

沒找到可能就是空啊

31if (!find)

3235

else

3645

}46 console.readkey();

這種迴圈的演算法固然很好,但是出現漏值的情況。譬如說

15=1+2+3+4+5

15=4+5+6

15=&+7

這裡遺漏了15=1+2+3+4+5,我這個演算法這麼做固然很好啊,因為他的時間複雜度是o(n).但,我要明白這麼一點的話他是以此迴圈,同樣的數字不可能遍歷2次。因此解決這個方案。必須需要兩層迴圈。因此,必須進行方法的重構。偽**如下:

相應源**如下:

1 console.writeline("

請你輸入乙個數字");

2int mi = int

.parse(console.readline());

3int temp =mi;

4bool find = false;5

int temp1 = 0

;6 list strs = new list();78

9string tempstr = string

.empty;

1011

for (int i = (mi - 1) / 2 + 1; i >= 1; i--)

1231

32if (temp < 0)33

38//

j==1 清空迴圈

39if (j == 1)40

4445}46

474849}

5051

if (!find)

5255

else

5664

}65 console.readkey();

執行效果如下所示:

這道題有效的考察了迴圈的知識及簡單演算法的題目,對初學者學習演算法很有好處。

一道百度之星程式設計大賽題的隨筆聯想 (2)

鄙人雖然是乙個.net程式設計師,在工作之餘,喜愛演算法。我覺得這個題目有點意思,故而分享給大家,我想到兩種方法,提供大家,希望對大家起了乙個開闊思路的作用。下面介紹解法二了。解法二,是抓小放大。由小及大。首先,說一說我分析的思路吧。第一步,還是判斷i是不小於i 2,以此迴圈了。第二步,是不是判斷此...

一道百度之星程式設計大賽題的隨筆聯想 (1)

鄙人雖然是乙個.net程式設計師,在工作之餘,喜愛演算法。我覺得這個題目有點意思,故而分享給大家,我想到兩種方法,提供大家,希望對大家起了乙個開闊思路的作用。首先,看題目是那樣的 請編寫程式,根據輸入的任何乙個正整數,找出符合這種要求的所有連續正整數序列。輸入資料 乙個正整數,以命令列引數的形式提供...

一道百度之星程式設計大賽題的隨筆聯想 (2)

鄙人雖然是乙個.net程式設計師,在工作之餘,喜愛演算法。我覺得這個題目有點意思,故而分享給大家,我想到兩種方法,提供大家,希望對大家起了乙個開闊思路的作用。下面介紹解法二了。解法二,是抓小放大。由小及大。首先,說一說我分析的思路吧。第一步,還是判斷i是不小於i 2,以此迴圈了。第二步,是不是判斷此...