1. 程式人生 > >返回一個迴圈陣列的最大子陣列以及最大子陣列和

返回一個迴圈陣列的最大子陣列以及最大子陣列和

  設計介面:

程式設計:1.封裝一個求迴圈整陣列最大子陣列和的子程式;

                  2.設計一個主函式,主函式可以呼叫子函式;

                  3.在主函式中新增程式碼,使主函式可以輸出想要的結果。

遇到的問題:1.在呼叫求迴圈整陣列的最大子程式時,如何將一個整陣列變成一個迴圈整陣列並且賦值給子函式;

                      2.設計迴圈子陣列的時候,如何使子陣列的長度不大於原陣列的長度,並且還能夠得到預想的結果;

                      3.如何同時將子陣列的和和子陣列本身同時返回給主函式。

解決方案: 1.定義一個新陣列,其長度為原陣列長度的二倍-1,將原陣列依次賦值給新陣列長度相同的部分,超出的部分從頭開始再次將原陣列賦值進去,直到新陣列全部有值為止。

                   2. for (int i = 0; i < (a.Length+1)/2; i++)
            {
                temp = a[i];                                     //開始從a[i]往它之後遍歷,從a[i]開始累加,逐一跟sum對比
                b = Convert.ToString(a[i]);
                if (sum < temp)
                {
                    sum = temp;                              //得出最大的一個Sum值,並且返回Sum
                    c = b;
                }
                for (int j = i + 1; j-i < (a.Length+1)/2-1; j++)            
                {
                    temp = temp + a[j];
                    b = b + "+" + Convert.ToString(a[j]);
                    if (sum < temp)
                    {
                        sum = temp;                              //得出最大的一個Sum值,並且返回Sum
                        c = b;
                    }
                };

                   3.將最大子陣列的和與它本身一併賦值給一個String型別的值,並且返回這個值

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace _1000個數字的整陣列的最大子數陣列和 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //求一個任意的迴圈整數陣列最大的連續子陣列和 public string Sum(int[] a) { if (null == a) { return "0"; } //判斷陣列是否為空,如果是空的話,令返回值為0 if (a.Length == 1) { return "a[0]"; } //判斷數組裡面是否只有一個元素,是,則返回此元素 int sum = a[0]; string b = null; string c = b; int temp; for (int i = 0; i < (a.Length+1)/2; i++) { temp = a[i]; //開始從a[i]往它之後遍歷,從a[i]開始累加,逐一跟sum對比 b = Convert.ToString(a[i]); if (sum < temp) { sum = temp; //得出最大的一個Sum值,並且返回Sum c = b; } for (int j = i + 1; j-i < (a.Length+1)/2-1; j++) { temp = temp + a[j]; b = b + "+" + Convert.ToString(a[j]); if (sum < temp) { sum = temp; //得出最大的一個Sum值,並且返回Sum c = b; } } } string d = Convert.ToString(sum) +" "+ "最大子陣列為" + c; return d; } private void button1_Click(object sender, EventArgs e) { Random random = new Random(); double min, max; min = Convert.ToDouble (textBox2.Text); max = Convert.ToDouble (textBox3.Text); int[] a = new int[1000]; for (int i = 0; i < 1000; i++) { a[i] = random.Next((int)min, (int)max); richTextBox1.AppendText(Convert.ToString(a[i])+" "); } string sum=Sum (a); //呼叫定義的封裝好的子程式求和 textBox1.Text = sum; } private void textBox3_TextChanged(object sender, EventArgs e) { } private void textBox2_TextChanged(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { richTextBox1.Text=""; textBox1.Text = ""; } private void button3_Click(object sender, EventArgs e) { string[] b = richTextBox1.Text.Split(new string[] { "" }, StringSplitOptions.RemoveEmptyEntries); int[] list = new int[b.Length]; int[] list1 = new int[b.Length*2-1]; for (int i = 0; i < b.Length; i++) { list[i] = int.Parse(b[i]); list1[i] = list[i]; } for (int i = 0; i < b.Length-1; i++) { list1[i + b.Length] = list[i]; } textBox1.Text = Convert.ToString(b.Length); string sum = Sum(list1); textBox1.Text = Convert.ToString(sum); } private void textBox1_TextChanged(object sender, EventArgs e) { } private void richTextBox1_TextChanged(object sender, EventArgs e) { } } }

執行結果: