将数组的元素相乘 - 将 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
如您所见,对于存储在数组中的如此大的数字,结果是正确的。
这是此处给出的答案中唯一或多或少正确的函数实现。
所以我想出了如何使用 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
如您所见,对于存储在数组中的如此大的数字,结果是正确的。
这是此处给出的答案中唯一或多或少正确的函数实现。