Если вы используете вызов функции по значению для выполнения вычислений с переданным аргументом, то для получения результата вычислений в вызывающей функции функция должна вернуть значение. То есть тип возвращаемого значения не должен быть void
.
. Определение функции fact
не имеет смысла. В for l oop параметр i
переназначается на 1
. Сам l oop никогда не повторяется, потому что другая переменная j
установлена в 0
. Так что оно не может быть больше 1
.
int j=0;
for(i=1; j>1; j--){
Функция может быть определена следующим образом
//factorial definition:
unsigned long long int fact( unsigned int i )
{
unsigned long long int f = 1;
while ( i > 1 ) f *= i--;
return f;
}
Факториал определен для натуральных чисел без знака.
В main вам нужно объявить переменную тип unsigned int, такой как
unsigned int x;
Этот вызов scanf
scanf("%d", x);
является неправильным. Функция должна принять свой целочисленный аргумент по ссылке, чтобы изменить его.
scanf( "%u", &x );
Чтобы получить результат функции fact
, вам нужно ввести еще одну переменную
unsigned long long int result = fact( x );
И чтобы вывести его, вы должны написать
printf( "value of %u! = %llu\n", x, result );
Вот демонстрационная программа.
#include <stdio.h>
unsigned long long int fact( unsigned int );
int main(void)
{
unsigned int x;
scanf( "%u", &x );
unsigned long long int result = fact( x );
printf( "value of %u! = %llu\n", x, result );
return 0;
}
//factorial definition:
unsigned long long int fact( unsigned int i )
{
unsigned long long int f = 1;
while ( i > 1 ) f *= i--;
return f;
}
Если ввести число 20
, то вывод функции будет
value of 20! = 2432902008176640000
Обратите внимание, что 20
- это максимальное число, факториал которого может храниться в объекте типа unsigned long long int
.
Если вы хотите, чтобы функция принимала свой аргумент по ссылке и возвращала В результате в аргументе вы должны объявить переменную x
как имеющую тип unsigned long long int.
Вот демонстрационная программа.
#include <stdio.h>
void fact( unsigned long long int * );
int main(void)
{
unsigned long long int x;
scanf( "%llu", &x );
printf( "value of %llu! = ", x );
fact( &x );
printf( "%llu\n", x );
return 0;
}
//factorial definition:
void fact( unsigned long long int *x )
{
unsigned long long int f = 1;
while ( *x > 1 ) f *= ( *x )--;
*x = f;
}
Если ввести 20
тогда вывод программы будет таким же, как показано выше.
value of 20! = 2432902008176640000