2017-01-20 2 views
0

ここでは、合計が最大でその合計を表示する8つの隣接数を見つけます。また、この値に加算される8つの隣接数を表示する必要があります。私はこれらの値を表示する方法に立ち往生しています。これまでの私のコードは以下の通りです:Visual Basic:文字グループから特定の値を表示するには

Dim chars As Char() = "73167176531330624919225119674426574742355349194934" & 
"96983520312774506326239578318016984801869478851843" & 
"85861560789112949495459501737958331952853208805511" & 
"12540698747158523863050715693290963295227443043557" & 
"66896648950445244523161731856403098711121722383113" & 
"62229893423380308135336276614282806444486645238749" & 
"30358907296290491560440772390713810515859307960866" & 
"70172427121883998797908792274921901699720888093776" & 
"65727333001053367881220235421809751254540594752243" & 
"52584907711670556013604839586446706324415722155397" & 
"53697817977846174064955149290862569321978468622482" & 
"83972241375657056057490261407972968652414535100474" & 
"82166370484403199890008895243450658541227588666881" & 
"16427171479924442928230863465674813919123162824586" & 
"17866458359124566529476545682848912883142607690042" & 
"24219022671055626321111109370544217506941658960408" & 
"07198403850962455444362981230987879927244284909188" & 
"84580156166097919133875499200524063689912560717606" & 
"05886116467109405077541002256983155200055935729725" & 
"71636269561882670428252483600823257530420752963450" 
Dim index As String = 0 
    Dim x = 0 
    Dim values = Array.ConvertAll(chars, Function(c) CInt(c.ToString())) 
    Dim maxSum = 0 
    For i = 0 To values.Length - 8 
     Dim sum = values(i) 
     For x = i + 1 To i + 7 
      sum += values(x) 
      index = i 
     Next 
     If sum > maxSum Then 
      maxSum = sum 
     End If 
    Next 
    Console.WriteLine(index) 
    Console.WriteLine(maxSum) 
    Console.Read() 
End Sub 
+0

** vb.net **ない** VBA ** – cyboashu

+0

あなたは(内部のそれを持ってどこから '指数= i'を移動する必要があります内部ループ)を 'maxSum = sum'の後(新しい最大合計を見つけたとき)に変更します。 – Blackwood

+0

私はそれを試みましたが、それは353を表示しました。理由はわかりません。 –

答えて

1

ここでは、2つの異なるアプローチを使用してそれを取ります。第二は、LINQを利用しながら、最初は、より伝統的なアプローチである:

Sub Main() 
    Dim chunkSize As Integer = 8 
    Dim source As String = 
     "73167176531330624919225119674426574742355349194934" & 
     "96983520312774506326239578318016984801869478851843" & 
     "85861560789112949495459501737958331952853208805511" & 
     "12540698747158523863050715693290963295227443043557" & 
     "66896648950445244523161731856403098711121722383113" & 
     "62229893423380308135336276614282806444486645238749" & 
     "30358907296290491560440772390713810515859307960866" & 
     "70172427121883998797908792274921901699720888093776" & 
     "65727333001053367881220235421809751254540594752243" & 
     "52584907711670556013604839586446706324415722155397" & 
     "53697817977846174064955149290862569321978468622482" & 
     "83972241375657056057490261407972968652414535100474" & 
     "82166370484403199890008895243450658541227588666881" & 
     "16427171479924442928230863465674813919123162824586" & 
     "17866458359124566529476545682848912883142607690042" & 
     "24219022671055626321111109370544217506941658960408" & 
     "07198403850962455444362981230987879927244284909188" & 
     "84580156166097919133875499200524063689912560717606" & 
     "05886116467109405077541002256983155200055935729725" & 
     "71636269561882670428252483600823257530420752963450" 

    Dim strChunk As String 
    Dim strMaxChunk As String = "" 
    Dim curSum, MaxSum As Integer 
    Dim values() As Integer 
    For i As Integer = 0 To source.Length - chunkSize 
     strChunk = source.Substring(i, chunkSize) 
     values = Array.ConvertAll(strChunk.ToCharArray, Function(c) CInt(c.ToString())) 
     curSum = values.Sum 
     If curSum > MaxSum Then 
      MaxSum = curSum 
      strMaxChunk = strChunk 
     End If 
    Next 
    Console.WriteLine("Traditional") 
    Console.WriteLine("Max Sum = " & MaxSum & " from " & strMaxChunk) 

    Dim sums = From chunk In Enumerable.Range(0, source.Length - chunkSize).Select(Function(x) source.Substring(x, chunkSize)) 
       Select chunk, sum = Array.ConvertAll(chunk.ToCharArray, Function(y) CInt(CStr(y))).Sum 
       Order By sum Descending 

    Dim linqResult = sums.First 
    Console.WriteLine("Linq") 
    Console.WriteLine("Max Sum = " & linqResult.sum & " from " & linqResult.chunk) 

    Console.ReadLine() 
End Sub 
+0

技術的にも、最初のアプローチでは 'values.Sum'行でLINQを使用していますが、これは従来のループに簡単に置き換えることができます。 –

+0

私はこれを見たが、忙しかった。 SubStringチャンクを変換する "従来の"アプローチを採用しました。私は両方のソリューションをStopWatch.Elapsed.TotalMillisecondsを平均化のための配列に返す関数に入れました。各100回の反復で、伝統は30%速くなります。 – MrGadget

関連する問題