Fatorial de vários números dentro de uma função

Olá, boa tarde! Estou tendo dificuldade em calcular o fatorial de vários números. O problema, além do fatorial de vários números e fazer tudo isso dentro de uma função. O que eu devo fazer é calcular (x! + y! + z!) dentro de uma função e devolver o valor para uma função principal e eu não tô conseguindo fazer nem para um número só :sweat_smile::sweat_smile::sweat_smile::sweat_smile:

Desde já, agradeço imensamente a ajuda.
#include <stdio.h>
#include <stdlib.h>
int fatorial_x(n);

int main (){
    printf("\nFatorial calculado: %d", fat);
return 0;
}
int fatorial_x(n){
int fat, n;
printf("Insira um valor para o qual deseja calcular seu fatorial: ");
scanf("%d", &n);

for(fat = 1; n > 1; n = n - 1)
fat = fat * n;
return fat;
}

Fatorial é uma aplicação clássica de recursividade. Dê uma estudada nisso e esse problema fica simples de resolver.

Bom, no main você fez isso:

printf("\nFatorial calculado: %d", fat);

Ou seja, está usando uma variável fat que não foi declarada. Até existe uma variável fat, mas ela está dentro da função fatorial_x (ela só existe lá dentro, mas no main ela não é vista). Então na verdade você precisa chamar a função, para que o cálculo seja feito.

Outra coisa que eu faria é separar as responsabilidades: a função deveria ser responsável apenas pelo cálculo, e a leitura do valor deveria ficar fora dela. Resumindo, ficaria assim:

int fatorial_x(n) {
    int fat = 1; // ATENÇÃO: tem que inicializar a variável, senão ela começa com um valor qualquer
    for (int i = 2; i <= n; i++)
        fat *= i;
    return fat;
}

int main () {
    int n;
    printf("Insira um valor para o qual deseja calcular seu fatorial: ");
    scanf("%d", &n);
    printf("\nFatorial calculado: %d", fatorial_x(n));
    return 0;
}

No for eu começo em 2, pois não tem porque multiplicar por 1: qualquer número multiplicado por 1 é igual a ele mesmo, então posso pular este passo desnecessário e começar direto no 2.


Eu também mudaria o nome da função para simplesmente fatorial, pois ela não calcula somente o fatorial de x, e sim de qualquer número (esse x no nome não acrescenta nada).

Depois, se quiser calcular x! + y! + z!, é só reaproveitar a função:

int fatorial(n) {
    int fat = 1; // ATENÇÃO: tem que inicializar a variável, senão ela começa com um valor qualquer
    for(int i = 2; i <= n; i++)
        fat *= i;
    return fat;
}

int main () {
    int x, y, z;
    printf("Valor de x: ");
    scanf("%d", &x);
    printf("Valor de y: ");
    scanf("%d", &y);
    printf("Valor de z: ");
    scanf("%d", &z);
    printf("\nx! + y! + z!= %d", fatorial(x) + fatorial(y) + fatorial(z));
    return 0;
}

Ao contrário do que sugeriram acima, não use recursão. Entendo que fatorial é muito usado para ensinar recursão (pois a definição matemática é recursiva e de fato fica mais “didático” usá-lo como exemplo), mas o que esquecem de mencionar é que a implementação recursiva é bem pior que um loop simples (por fazer várias chamadas de função à toa, etc).

Recursão é um recurso interessante e tal, mas para casos como esse, um loop simples é a melhor solução.

Muito muito obrigado. Realmente da forma que você explicou faz MUUUUUUUUUUUUUUUUUUUUUUUUUUITO mais sentido e a foram recursiva é um saco. O loop simples é bem mais… simples !!!
E eu entendi agora os erros… A variável não estava declarada! Também entendi sobre a função, que ela deve ser responsável apenas pelo cálculo e a leitura fica fora. Entendi também o inicio em 2. É bem mais simples.

Agora complicando um pouco mais… O que eu faria para somar o X + Y + Z e depois tirar o fatorial? Tipo… (X+Y+Z)!?

Ué, primeiro soma e depois calcula o fatorial :slight_smile:

printf("(x + y + z)!= %d", fatorial(x + y + z));
1 curtida

Agora eu entendi !!! Aquela função do fatorial eu faço só uma vez e chamo ela nos meus prints dependendo da forma que eu quero (soma, subtração, etc… ) Só devo ficar esperto em caso de número negativo.

Valeu demais, Hugo