Algorithm 接受4个输入并打印三个数字中最大值/最佳值之和的伪算法

Algorithm 接受4个输入并打印三个数字中最大值/最佳值之和的伪算法,algorithm,pseudocode,Algorithm,Pseudocode,我需要一些关于伪代码作业的帮助: 输入4个数字并打印最大3个数字的总和 例如: 输入:14,1,9,3 产出:14+9+3=>26 如何用上述任务的伪代码编写算法 到目前为止,我已经得出以下结论: input a, b, c, d declare h1, h2, h3 if(a>=b && a>=c && a>=d) h1 = a if(b>=a && b>=c && b>=

我需要一些关于伪代码作业的帮助: 输入4个数字并打印最大3个数字的总和

例如: 输入:14,1,9,3 产出:14+9+3=>26

如何用上述任务的伪代码编写算法

到目前为止,我已经得出以下结论:

input a, b, c, d
declare h1, h2, h3
    if(a>=b && a>=c && a>=d)    h1 = a
    if(b>=a && b>=c && b>=d)    h2 = b
    if(c>=a && c>=b && c>=d)    h3 = c
    if(d>=a && d>=b && d>=c)    h4 = d
print h1+h2+h3
这有什么好处吗

  • 假设输入在数组
    t
  • sum=t[0]
  • min=t[0]
  • 对于从1到3的
    i
    ,重复步骤5和6:
  • sum+=t[i]
  • if(min>t[i])min=t[i]
  • 返回
    sum-min
  • 您和Brian介绍的另一种方法可以归结为排序(对于n=4,您可以像您那样“手动”进行排序,但对于较大的n,这不是一个好主意),然后取和


    我更喜欢上面所示的方法,因为它保证了线性时间复杂度,可以很好地扩展,并且易于实现。它只通过一次输入数据,如果输入一个接一个地流式传输,并且我们不想将输入存储在内存中(我们想“动态地”执行),则可以使用它。如果对输入数据没有任何假设,排序可能比线性(可能是nlogn)更昂贵。

    您的伪代码有一个良好的开端。但现在你只能找到四个数字中最大的一个。您需要再重复两次(忽略最大值)才能找到第二和第三大值

    另一个聪明的想法是,如果你需要3个最大的数字,那么你的第4个数字必须是最小的。找到最小的数字,然后将其他数字相加

    input a, b, c, d
    declare min
    
    // find the smallest
    min = a
    if (b < min) min = b
    if (c < min) min = c
    if (d < min) min = d
    
    // the sum of the largest 3 = the sum of all 4 minus the minimum
    print a + b + c + d - min
    
    输入a、b、c、d
    声明min
    //找到最小的
    最小=a
    如果(b
    使用递归。如果输入中的第一个数字最小,则将其他三个数字相加,否则旋转输入并递归调用。最后,最小的数字将是a,因此其他三个是最大的,您可以将它们相加并返回答案。在伪代码中:

    function sum3max(a, b, c, d)
        if a == min(a, b, c, d)
            return b + c + d
        return sum3max(b, c, d, a)
    

    伪代码只是编写您将要采取的步骤,而不关心实际的代码语法。在您解决头脑中的问题时,仔细观察您自己的思维过程。快点,在你忘记之前,写下你想到的步骤!假设没有相等的值(请注意),您的伪代码将(唯一的)最大值赋给一个h变量。其他h变量未被触及。items.Sum()-items.Min()作为print a+b+c+d-Min(Min(a,b),Min(c,d)),您的伪代码中仍然存在错误。如果
    (a,b,c,d)=(1,1,1,2)
    总和将是未定义的。事实上,在没有明确最低限度的情况下,这种情况都会发生。@JuanLopes你是对的。我只是假设了4个不同的数字,但我会修正它。