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

2021-09-23 21:47:59 字數 2823 閱讀 8121

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

首先,看題目是那樣的:

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

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

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

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

1 2 3 4 5

4 5 6

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

none

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

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

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

相應的源**如下:

1        console.writeline("請你輸入乙個數字");

2 int mi = int.parse(console.readline());

3 int temp = mi;

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

5 bool find = false;

6 int temp1 = 0;

7 //記錄最終的結果

8 liststrs = new list();

9 //憑藉成最終的字串

10 string tempstr = string.empty;

11 //進行迴圈拆解

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

13

28

29 }

30 //沒找到可能就是空啊

31 if (!find)

32

35 else

36

45 }

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("請你輸入乙個數字");

2 int mi = int.parse(console.readline());

3 int temp = mi;

4 bool find = false;

5 int temp1 = 0;

6 liststrs = new list();

7 8

9 string tempstr = string.empty;

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

12

31 32 if (temp < 0)

33

38 //j==1 清空迴圈

39 if (j == 1)

40

44 45 }

46 47

48 49 }

50 51 if (!find)

52

55 else

56

64 }

65 console.readkey();

執行效果如下所示:

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

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

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

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

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

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

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