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