【问题标题】:Factorial of a number using user defined function giving garbage value in c使用用户定义函数在 c 中给出垃圾值的数字的阶乘
【发布时间】:2020-05-15 04:43:20
【问题描述】:

我试图构建一个程序来使用用户定义的函数计算阶乘,但它给出了一个垃圾值这个程序是 c-cat 准备的赋值

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int accept_num();             // Function call
int fact();                   // Function call
void display_num();           // Function call
int main()
{
    int num;

    num = fact();        //calling factorial

    display_num(num);    //calling printf

}
    //take input
    int accept_num()
{
     int n;
     printf("Enter number: ");
     scanf("%d",&n);
     return n;
 }
    //calculate factorial
 int fact()
{
    int i,num1;
    unsigned long long factr=1;

    num1 = accept_num();

    for(i=1; i<=num1; i++)
    {
        factr *= i;
    }
    return factr;
}

void display_num(int num2)
{
    printf("Answer = %llu",num2);
}

【问题讨论】:

  • 你从fact返回int而不是unsigned long long
  • display_num 也应该做相应的修改。

标签: c function dynamic-programming factorial


【解决方案1】:

不匹配的类型通常会导致垃圾值。计算阶乘后,您将其存储到int 类型,并在display_num() 函数中打印unsigned long long int,其保留的位数比int 多。此外,如果您使用int i,在int 的限制之后循环迭代后,将导致阶乘的错误值。

以下是精炼代码,将每个int替换为unsigned long long int

#include<stdio.h>
#include<stdlib.h>
unsigned long long int accept_num();             // Function call
unsigned long long int fact();                   // Function call
void display_num();           // Function call
int main()
{
    //changed the datatype of num
    unsigned long long int num;

    num = fact();        //calling factorial

    display_num(num);    //calling printf

}
    //take input
   unsigned long long int accept_num()
{
    //changed datatype of n
     unsigned long long int n;
     printf("Enter number: ");
     scanf("%llu",&n);
     return n;
 }
    //calculate factorial
 unsigned long long int fact()
{
    unsigned long long int i;

    //changed datatype of num1
    unsigned long long int num1;
    unsigned long long int factr=1;

    num1 = accept_num();

    for(i=1; i<=num1; i++)
    {
        factr *= i;
    }
    return factr;
}

//changed datatype of argument num2
void display_num(unsigned long long int num2)
{
    printf("Answer = %llu",num2);
}

此外,还有更多冗余变量可以减少。参考这段代码:

#include<stdio.h>
long int multiplyNumbers(int n);

int main() {
    int inputNumber;
    printf("Enter a positive integer: ");
    scanf("%d",&inputNumber);
    printf("Factorial of %d = %ld", inputNumber, multiplyNumbers(inputNumber));
    return 0;
}

//calculate factorial using recursion
long int multiplyNumbers(int n) {
    if (n>=1)
        return n*multiplyNumbers(n-1);
    else
        return 1;
}

【讨论】:

  • 精炼代码有int fact()。确定返回类型?
  • 其实返回类型并不是唯一的问题,我发现使用int i也会导致错误的答案,因为在达到int的限制后,它最终会被乘以0。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
相关资源
最近更新 更多