在C中打印出从(0到n)的因子列表

时间:2018-05-24 23:46:22

标签: c loops factorial

所以我开始学习编码,也许是因为我不完全理解循环的本质。

所以我想要的输出是:

如果输入的值例如是6,程序应该产生:

  • 0! = 1
  • 1! = 1
  • 2! = 2
  • 3! = 6
  • 4! = 24
  • 5! = 120
  • 6! = 720

但相反它是打印这个:

  • 0! = 1
  • 6! = 720

显然没有明确的要点。显然,第二个for循环不能正确打印出来。我不确定为什么。如果有人可以帮助我,我们将不胜感激!

编辑:我真的应该指明我正在寻找的东西。感谢您提供所有有用的回复。我意识到您的所有解决方案都可能有效,但我正在寻找一种不涉及创建新程序和功能的解决方案。 对于我使用除main()以外的其他函数/过程的赋值无效。我的代码中的问题似乎是第二个for循环没有完全运行,我不知道为什么。该程序应该正常输入一个输入值,但是我将这些值硬编码到变量中,这些变量会产生影响,但它并不存在。如果有任何方法可以实现这一点,只需使用if,for或while循环对我来说是最佳方式。

#include <stdio.h>

   int main( void )
{
    int number1 = 4;
    int number2;
    int factorial = 1;
    int factorialPrev = 1;

    printf("0! = 1\n");

    for (int i = 0; i < number1; i++)
    {
        factorial = factorial * (number1 - i);
    }

    for (int i = number1 - 1; i <= 0; i--)
    {
        number2 = number1 - i;
        factorialPrev = factorialPrev * number2;
        printf("%d! = %d\n", number2, factorialPrev);
    }

    return 0;
}

3 个答案:

答案 0 :(得分:2)

你的代码有点......令人困惑,所以我只是重写它。这是绝对最低限度的功能:

user time   condition
11  1:05    FALSE
11  1:10    TRUE
11  1:25    FALSE
11  1:25    TRUE
11  1:25    TRUE
11  1:25    TRUE
11  1:40    FALSE
22  2:20    FALSE
22  2:40    FALSE
22  2:40    TRUE
22  2:40    TRUE

让我们把它包装在一个函数中:

printf("0! = 1\n");

int factorial = 1;
for (int n = 1; n <= number; n++) {
    factorial *= n;
    printf("%d! = %d\n", n, factorial);
}

现在让我们为无效输入添加一些警卫:

void printFactorials(int number) {
    printf("0! = 1\n");

    int factorial = 1;
    for (int n = 1; n <= number; n++) {
        factorial *= n;
        printf("%d! = %d\n", n, factorial);
    }
}

最后,让我们使用它:

void printFactorials(int number) {
    if (number < 0) {
        printf("Input cannot be less than 0");
        return;
    }

    if (number > 9) {
        printf("Input cannot be greater than 9");
        return;
    }

    printf("0! = 1\n");

    int factorial = 1;
    for (int n = 1; n <= number; n++) {
        factorial *= n;
        printf("%d! = %d\n", n, factorial);
    }
}

答案 1 :(得分:2)

这应该是一个正确的答案:

void showfacto(int max) {
if (max< 0) {
    printf("the max cannot be less than 0");
    return;
}   
printf("0! = 1\n");
int x=1;
for (int i= 1; n <= number; n++) {
 {   for(int j=1;j<i)
      x=x*j;
    }
    printf("%d! = %d\n",i, x);
 }  

如果你想限制最大数量,你只需要添加一个条件,如果数字大于9,例如,返回。

答案 2 :(得分:1)

您也可以通过重复调用递归函数来解决此问题,只需获取单个数字的阶乘。像这样:

int fact(int num) {
    if(num > 1) {
        return num * fact(num - 1);
    }
    else {
        return 1;
    }
}

因此对事实(5)的初始调用将一直到事实(1)返回1.然后控制返回到事实(2),其中你有2 *从事实(1)返回的数字,从那里开始,直到它回到事实(5)的初始调用,它应返回最终值。

fact(1) = 1
fact(2) = 2 * 1  = 2
fact(3) = 3 * 2  = 6
fact(4) = 4 * 6  = 24
fact(5) = 5 * 24 = 120

然后在main()中你有一个循环,它将递归函数从num调用到0,递减。或者如果你想,你可以从0开始,然后增加到num。

for(x = num; x >= 0; --x) {
    factNum = fact(x);
    printf("%d! = %d\n", x, factNum);
}