如何求二维数组不同行不同列元素和的最大值
如何求M行N列二维数组不同行不同列元素和的最大值!请各位高手给出思路,能给出实现的代码更好,非常感谢!!
不同行不同列?那规律呢??
总得要有一个规律吧。
2维数组,在内存中排列是一个平面的排列,标记成2维数组,只是便于访问而以。
找不到最大下标等等情况,那就尝试使用一维数组来做吧。
程序代码:Option Explicit
Private Type jg
h As Long
l As Long
v As Long
End Type
Private Sub Command1_Click()
'定义变量
Dim fj() As String '输入的数据分解数组
Dim dat() As Long '中间数据,一维数组
Dim dat2() As Long '二维数组
Dim jg() As jg '保存结果值
Dim hi As Long '多少行列,正方形
Dim s As String '字符串,输入和输出时用
Dim i As Long, j As Long 'j为数据总个数
Dim k As Long
Dim m As Long, n As Long
Dim o As Long, o2 As Long '结果计数
Dim j1 As jg '中间结果
s = Trim(Text1.Text) '取输入值
s = Replace(s, vbCrLf, " ") '去掉回车
s = Trim(s) '使用DO来去掉多余的空格
i = 0
Do While i <> Len(s)
i = Len(s)
s = Replace(s, " ", " ")
Loop
fj = Split(s, " ") '分解
j = UBound(fj) '取个数
hi = Int(Sqr(j + 1)) '计算行数和列数,按正方形计算,直接开平方
ReDim dat(j) '重定义1维数组,用于保存原始数据
For i = 0 To j
dat(i) = Val(fj(i)) '读原始数据
Next i
ReDim jg(1 To j + 1, 1 To hi + 1) '结果数组
ReDim dat2(1 To hi, 1 To hi) '每次使用的临时数组
For i = 1 To hi '第一个元素是固定
For k = 1 To hi
o2 = (i - 1) * hi + k '计算该元素应该是第几个结果
For m = 1 To hi '复制数组
For n = 1 To hi
dat2(m, n) = dat((m - 1) * hi + n - 1)
Next n
Next m
With jg(o2, 1) '把结果写到第1个元素中去
.v = dat2(i, k)
.h = i
.l = k
End With
o = 2 '从第2个元素开始计算
For m = 1 To hi '清理第一个元素使用了的行和列中的数据
dat2(i, m) = 0
dat2(m, k) = 0
Next m
Do '循环查找后面的数据开始
j1.v = 0 '查找剩余数据的最大值
For m = 1 To hi
For n = 1 To hi
If dat2(m, n) > j1.v Then
With j1 '找到,先不管三七二十一,保存再说
.v = dat2(m, n)
.h = m
.l = n
End With
End If
Next n
Next m
jg(o2, o) = j1 '保存刚找到的数据
For m = 1 To hi '照样,清理掉刚最大值对应的行列
dat2(jg(o2, o).h, m) = 0
dat2(m, jg(o2, o).l) = 0
Next m
o = o + 1 '下一个元素
Loop While o < hi + 1 '没有结束时,就继续查找
For m = 1 To hi '计算当前行的结果
jg(o2, hi+1).v = jg(o2, hi+1).v + jg(o2, m).v
Next m
Next k
Next i
o = 1 '先假设第1个结果是最大的
s = ""
For i = 1 To j + 1 '查找结果中的最大值
If jg(o, hi+1).v < jg(i, hi+1).v Then
o = i
End If
For k = 1 To hi - 1 '同时生成每行的 输出信息
s = s & jg(i, k).v & "+"
Next k
s = s & jg(i, hi).v & "=" & jg(i, hi + 1).v & vbCrLf
Next i
s = s & vbCrLf & vbCrLf '空一行
s = s & o & vbCrLf '输出第几个结果
For k = 1 To hi - 1 '输出结果内容
s = s & jg(o, k).v & "+"
Next k
s = s & jg(o, hi).v & "=" & jg(o, hi + 1).v & vbCrLf
Text2.Text = s '显示
End Sub