【问题标题】:multiplying the elements of an array - converting a for loop into a while loop将数组元素相乘 - 将 for 循环转换为 while 循环
【发布时间】:2020-03-28 18:08:11
【问题描述】:

所以我想出了如何使用 for 循环来编写它

int mult_for(int* array, int len) {
    int mult = 1;
    for (int i = 0; i < len; i++) {
        mult *= array[i];
    }
    return mult;
}

但我不确定如何使用 while 来做同样的事情。

int mult_while(int* array, int len) {
    int mult = 1; 
    while (int i < len){
    mult *= array[i]
    }
    return 0;
}

我目前有这个,但不确定如何从那里继续。 c 的语法仍然是新的,所以这也无济于事。

【问题讨论】:

    标签: c for-loop while-loop control-flow


    【解决方案1】:

    For 循环 使用for(initialization; condition; increment/decrement) { body } 语法,这是大多数语言的通用规则。

    上述三个阶段(初始化条件递增/递减)存在于循环的每个变体中,对于一个while 循环 它们遵循以下顺序:

    initialization
    
    while(condition)
    { 
      body
      increment/decrement
    }
    

    对于您的情况:

        int i = 1; //initialization
        while (i < len) //while(condition)
        {
          mult *= array[i]; //body
          i++; //increment
        }
    

    注意:

    • 这里的初始化是指初始化要在循环内使用的变量。可以有多个变量。
    • 增量/减量可以在循环体之前/之后。
    • 您也可以有一个 while 循环而不定义额外的循环变量。例如在您的情况下,如果您在代码中使用预定义的len 变量,则可以将其用作循环 的条件,直到使用while(len--) { body } 使值变为零,从而减少需要额外的变量及其后续的递增/递减语句。

    【讨论】:

      【解决方案2】:

      这是我第一次看到int 类型定义器作为while 循环的条件。无论如何,你需要增加你的计数器,即i,一个一个地迭代数组。当i == len 发生在您的for-loop 示例中时,它就会停止。

      int mult_while(int* array, int len) 
      {
          int mult = 1; 
          int i = 0;
          while (i < len) {
              mult *= array[i];
              ++i;
          }
          return mult; // the result must be returned in lieu of zero
      }
      

      【讨论】:

        【解决方案3】:

        您可以通过不断递减len 直到达到0 来轻松做到这一点:

        int mult_while(int const* array, int len) {
            int mult = 1;
            while(len--) {
                mult *= *array++;
            }
            return mult;
        }
        

        【讨论】:

          【解决方案4】:

          对于初学者来说,函数应该声明为

          long long int mult_while( const int *array, size_t len );
          

          即返回类型应为long long int 以避免溢出。并且应该使用限定符 const 声明指针,因为数组没有在函数内更改。数组的大小应该是size_t

          除了参数之外,您不需要再声明一个局部变量,就像在第一个函数实现中的 for 循环中所做的那样。

          该功能可以使用while循环通过以下方式实现。

          long long int mult_while( const int *array, size_t len )
          {
              long long int mult = len == 0 ? 0 : 1;
          
              while ( len-- ) mult *= array[len];
          
              return mult;
          }
          

          注意,一般情况下用户可以传递数组的长度等于0,这种情况下返回0逻辑上是一致的。

          这是一个演示程序。

          #include <stdio.h>
          #include <limits.h>
          
          long long int mult_while( const int *array, size_t len )
          {
              long long int mult = len == 0 ? 0 : 1;
          
              while ( len-- ) mult *= array[len];
          
              return mult;
          }
          
          int main(void) 
          {
              int a[] = { INT_MAX, INT_MAX };
              const size_t N = sizeof( a ) / sizeof( *a );
          
              for ( size_t i = 0; i < N; i++ )
              {
                  printf( "%d ", a[i] );
              }
          
              putchar( '\n' );
          
              printf( "The product of the array elements is equal to %lld\n", mult_while( a, N  ) );
          
              return 0;
          }
          

          程序输出是

          2147483647 2147483647 
          The product of the array elements is equal to 4611686014132420609
          

          如您所见,对于存储在数组中的如此大的数字,结果是正确的。

          这是这里给出的答案中唯一或多或少正确的函数实现。

          【讨论】:

          • mult = len == 0 ? 0 : 1; 可能只是 mult = len != 0;
          • @Ayxan I表达式本质上是等价的。
          • “注意,一般情况下用户可以传递的数组长度等于0,这种情况下返回0逻辑上是一致的。”不,将空乘积定义为 1 是完全一致且常见的。“即返回类型应为 long long int 以避免溢出” long long int 不会避免溢出,只是移动点它发生了。这些要点无助于回答问题或帮助此实现更加正确。
          • int 很糟糕,因为它在乘以两个 INT_MAX 时会溢出,而 long long int 很好,因为它直到......三个 INT_MAX 才会溢出。嗯。
          • 你一直这么说,但你没有提供很好的证据。 OP 说的是他们的原创作品,而你不知道他们的要求,所以你应该纠正它的唯一原因是,如果你有充分的理由说明原作错误的原因——但是,正如我所指出的,你不知道不。 (当然,你可以不同意——我只是觉得解释一下我的投票会很好。评论也有助于避免误导未来的访问者,所以你的兴趣并不是真正需要的。)
          猜你喜欢
          • 2018-02-22
          • 2017-04-26
          • 2018-08-19
          • 1970-01-01
          • 1970-01-01
          • 2022-12-04
          • 2020-06-20
          相关资源
          最近更新 更多