【问题标题】:What is the output of this pseudocode?这个伪代码的输出是什么?
【发布时间】:2010-10-04 10:11:42
【问题描述】:
procedure DoSomething(a_1, ... a_n)
 p = a_1
 for i = 2 to n
  temp = p
  for j = 1 to a_i
   p = p * temp

DoSomething(10,2,2,2)

我们得到的结果好坏参半。我们中的一个得到 10^7,另一个得到 10^27。

我想我发现了我的错误...我每次都用 10 代替 p,而不是用新的值代替 temp。

编辑:这是我的工作:

{10, 2, 2, 2}
p = 10
i = 2 to 4
 temp = p = 10
 j = 1 to 2
  p = 10 * 10 = 10^2
  p = 10^2 * 10 = 10^3
i = 3 to 4
 temp = 10^3
 j = 1 to 2
  p = 10^3 * 10 = 10^4
  p = 10^4 * 10 = 10^5
i = 4 to 4
 temp = 10^5
 j = 1 to 2
  p = 10^5 * 10 = 10^6
  p = 10^6 * 10 = 10^7

10^7

【问题讨论】:

  • 您在 PHP 代码中将 temp 设置为 arr[i],而不是 p。
  • 实际上,对于上述两种尝试的问题,请参阅我的回答。
  • 您在内循环的每一步都乘以 10 而不是 temp。
  • 有时将注意力放在问题上,而不是计算机上。这就是家庭作业的用途。在您的编辑中,您做对了:尝试解开并理解算法(我注意到我的谜语解决方案中有一个错误:))。
  • 我确实把我的想法...

标签: pseudocode


【解决方案1】:

您对 10^7 的计算存在错误,请参见下文。正确答案是 10^27 {10、2、2、2}

p = 10
i = 2 to 4
 temp = p = 10
 j = 1 to 2
  p = 10 * 10 = 10^2
  p = 10^2 * 10 = 10^3
i = 3 to 4
 temp = 10^3
 j = 1 to 2
  p = 10^3 * 10 = 10^4 -- p=p*temp, p=10^3 and temp=10^3, hence p=10^3 * 10^3.
  p = 10^4 * 10 = 10^5 -- Similarly for other steps.
i = 4 to 4
 temp = 10^5
 j = 1 to 2
  p = 10^5 * 10 = 10^6
  p = 10^6 * 10 = 10^7

【讨论】:

  • 格式化会很有帮助。 (在编辑器中使用两个换行符在最终输出中生成一个)
  • 两个换行符?啊!代码格式选项(每行前四个空格)看起来好多了。
【解决方案2】:

这段python代码显示的是10^27:

a = [10,2,2,2]
p = a[0]
for i in range(1,len(a)):
    temp = p
    for j in range(a[i]):
        p *= temp
print p

1,000,000,000,000,000,000,000,000,000

您发布的代码的问题是:

  • 在您的 10^7 解决方案中,您总是乘以 10,而不是 temp(在 j 循环之后增加到 p 的最终值)。
  • 您在 PHP 代码中将 temp 设置为 arr[i],而不是 p(我将在此处包含它,因此在您将其从问题中编辑出来后,我的回答仍然有意义 :-)。

    $arr = array(10, 2, 2, 2);
    $p = $arr[0];
    $temp = 0;
    for($i = 1; $i <= 3; $i++)
    {
        $temp = $arr[$i];
        for($j = 0; $j <= $arr[$i]; $j++)
        {
            $p = $p * $temp;
        }
    }
    echo $p;
    

【讨论】:

  • 在您发帖之前就意识到了这一点,但感谢您抽出宝贵时间回答。
【解决方案3】:

似乎是一个计算函数


(((a_1^(a_2+1))^(a_3+1))^(a_4+1)...

因此我们得到 ((10^3)​​^3)^3 = 10^(3^3) = 10^27

【讨论】:

    【解决方案4】:

    在 C 中:

    #include <stdio.h>
    
    double DoSomething(double array[], int count)
    {
      double p, temp;
      int i, j;
    
      p = array[0];
    
      for(i=1;i<count;i++)
      {
        temp = p;
        for(j=0; j<array[i];j++)
        {
          printf("p=%g, temp=%g\n", p, temp); /* useful to see what's going on */
          p = p * temp;
        }
      }
      return p; /* this isn't specified, but I assume it's the procedure output */
    }
    
    double array[4] = {10.0,2.0,2.0,2.0};
    
    int main(void)
    {
      printf("%g\n", DoSomething(array, 4));
      return 0;
    }
    

    而且,正如其他人所指出的那样,10e27。请注意,上面的伪代码非常冗长 - 可以通过多种方式进行简化。

    我使用了Tiny C Compiler - 非常小巧、轻便且易于用于此类简单的事情。

    -亚当

    【讨论】:

      【解决方案5】:

      难道不是 ((10^3)​​^4)^5 = 10 ^ 60 吗?

      【讨论】:

      • 其实是 ((10^3)​​^3)^3 = 10^27
      【解决方案6】:

      人们称 Python 为“可执行伪代码”是有原因的:

      >>> def doSomething(*args):
      ...     args = list(args);
      ...     p = args.pop(0)
      ...     for i in range(len(args)):
      ...         temp = p
      ...         for j in range(args[i]):
      ...           p *= temp
      ...     return p
      ...
      >>> print doSomething(10,2,2,2)
      1000000000000000000000000000
      

      【讨论】:

        【解决方案7】:

        我将程序输入到我的 TI-89 中,得到 p 值的答案为 1e27。

        t(a)
        Func
          Local i,j,p,tmp
          a[1]->p
          For i,2,dim(a)
            p->tmp
            For j,1,a[i]
              p*tmp->p
            EndFor
          EndFor
          Return p
        EndFunc
        
        t({10,2,2,2})       1.E27
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-14
          • 1970-01-01
          • 2016-06-11
          • 1970-01-01
          • 1970-01-01
          • 2015-09-24
          相关资源
          最近更新 更多