Для начала функция должна быть объявлена как
long long int mult_while( const int *array, size_t len );
, то есть тип возвращаемого значения должен быть long long int
, чтобы избежать переполнения. И указатель должен быть объявлен с квалификатором const
, потому что массив не изменяется внутри функции. Размер массива должен иметь тип size_t
,
Вам не нужно объявлять еще одну локальную переменную, кроме параметров, как это было сделано в for l oop в вашей первой реализации функции.
Функция может быть реализована следующим образом, используя while l oop.
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
Как вы можете видеть для такие большие числа, хранящиеся в массиве, дают правильный результат.
Это единственная реализация функции из представленных здесь в ответах, более или менее правильная.