鄙人雖然是乙個.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,以此迴圈了。第二步,是不是判斷此...