以下factorial find C程序中的错误是什么?

时间:2017-09-17 07:32:58

标签: c

我的逻辑已输入num存储到temp变量中,并使用temp = temp * (num - i)内的while查找因子,直到num大于0且最初i = 1,但我遇到问题,我的循环进入无限循环如何解决这个问题?

#include <stdio.h>

int main() {
    int num, temp, i;

    printf("Enter a Num who's factorial is need to be find : ");
    scanf("%d", &num);
    printf("num = %d\n", num);
    temp = num;
    printf("temp =  %d\n", temp);
    i = 1;
    while (num > 0) {
        temp = temp * (num - i);
        i++;
        printf(" i = %d\n ", i);
    }
    printf("fact = %d \n ", temp);
    return 0;
}

5 个答案:

答案 0 :(得分:2)

您正在检查num > 0,但永远不会更新num inside循环的值

更新它以检查num - i > 0num > i

while(num - i > 0)
{
    temp = temp * (num-i);
    i++;
    printf(" i = %d\n ",i);
}

答案 1 :(得分:1)

while(num > 0)
    {

num永远不会在循环内更新,因此num始终为> 0。您想要的是

while((num-i) > 0) 

i会在循环的每次运行中更新,因此最终num-i将变为0并且循环将终止。

答案 2 :(得分:0)

while(num>0)未更新。因此,您可以使用while((num-i)>0)进行更新循环。请尝试以下C代码。

#include <stdio.h>

int main(){
int num,temp,i;

printf("Enter a Num who's factorial is need to be find : ");
scanf("%d",&num);
printf("num = %d\n",num);
temp = num;
printf("temp =  %d\n",temp);
i=1;
while((num - i) > 0){
  temp = temp * (num-i);
  i++;
 printf(" i = %d\n ",i);
}
 printf("fact = %d \n ",temp);
 return 0;
}

答案 3 :(得分:0)

您不需要额外的变量i。重要的是你应该注意程序的时间和空间复杂性。

#include <stdio.h>    
int main()
{
    int num,temp;    
    printf("Enter a Num who's factorial is need to be find : ");
    scanf("%d",&num);
    printf("num = %d\n",num);
    temp = 1;
    while(num > 0)
    {
        printf(" num= %d\n ",num);
        temp = temp * num;
        num--;
    }
    printf("fact = %d \n ",temp);
    return 0;
}

答案 4 :(得分:0)

你永远不会在num循环体内更新while (num > 0),因此是无限循环。

您应该使用更简单的方法:一个经典的for循环,其索引i1增加到n。这样您就不会修改num的值,并可以将其用于最终输出:

#include <stdio.h>

int main(void) {
    int num, res, i;

    printf("Enter a number whose factorial to compute: ");
    if (scanf("%d", &num) == 1) {
        res = 1;
        for (i = 1; i <= num; i++) {
            res = res * i;
        }
        printf("%d! = %d\n", num, res);
    }
    return 0;
}

注意:

  • i的初始值可以更改为2
  • 阶乘增长非常快:此程序仅处理从012的数字。将res的类型更改为unsigned long long最多可处理20