将数组的元素相乘 - 将 for 循环转换为 while 循环

multiplying the elements of an array - converting a for loop into a while loop

所以我想出了如何使用 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 的语法仍然是新的,所以这也无济于事。

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

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

initialization

while(condition)
{ 
  body
  increment/decrement
}

针对您的情况:

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

注意:

  • 这里的初始化指的是初始化要在循环内使用的变量。可以有多个变量。
  • Increments/Decrements可以来before/after循环体。
  • 您也可以在不定义额外循环变量的情况下使用 while 循环。例如在您的情况下,如果您在代码中使用预定义的 len 变量,则可以将其用作 loop 的条件,直到使用 while(len--) { body },从而减少了对额外变量及其后续 increment/decrement 语句的需要。

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

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

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

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
}

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

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

即return类型应该是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。此时逻辑上会一致为return0。

这是一个演示程序。

#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

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

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