微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从C中的输入值中找到奇数阶乘

如何解决从C中的输入值中找到奇数阶乘

#include <stdio.h>

int main()
{
    int input;
    int result = 1;
    
    printf("Enter the integer number : ");
    scanf("%d",&input);
    printf("n:!\n\n");
    
    for(int i = 1; i <= input; i = i + 2)
    {   
        for(int k = 1; k <= i; k++)
        {
            result *= k;
        }
        printf("%d:%d\n",i,result);
    }
    
    return 0;
}

我创建了这样的代码来确定输入的奇数阶乘。在测试期间,我发现除5的阶乘外,值是错误的。似乎计算出错了,但是我不知道代码中的问题是什么。

解决方法

您的问题是,您要将结果与每个内部循环中的旧值相乘。在通过以下方法将内部循环重置结果开始为1之前解决此问题:

结果= 1;

,这与问题无关,但是我更喜欢避免使用该算法,因为它是O(n ^ 2/2),我们可以认为它是O(n ^ 2),而您可以使用它,它是O( n):

long

还要谨慎使用用于结果的 int 类型,int受限制,您应该使用 long double 因为事实运算的结果会很大

,

首先,最好不要对未定义的数据(例如用户输入)使用scanf。实际上,“不使用scanf”规则通常是有效的。这样的程序最好改用命令行参数。

从技术上讲,C main应该是int main(void)int main(int argc,char *argv[]的某些变体。

正如其他人提到的那样,在无负数的情况下,使用无符号整数进行这样的计算更为合理。对于像阶乘这样的东西,也应该使用更大的整数类型。

无论如何,关于主题:为什么不做得更简单?阶乘函数可以在一个循环中进行迭代。如果只想在i为奇数时打印结果,只需检查它是否为奇数。

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

static unsigned get_input(void);
static unsigned interpret_string(const char *str);

int
main(int argc,char *argv[])
{
    unsigned input;
    uint64_t result = 1;

    if (argc == 1) {
        printf("Enter the integer number : ");
        input = get_input();
        putchar('\n');
    } else {
        input = interpret_string(argv[1]);
    }

    for (unsigned i = 1; i <= input; ++i) {
        result *= i;
        if (i & 1)
            printf("%-2d = %"PRIu64"\n",(int)i,result);
    }

    return 0;
}

static unsigned
interpret_string(const char *str)
{
    char    *endp = NULL;
    unsigned ret  = strtoll(str,&endp,10);
    
    if (endp == str) {
        fprintf(stderr,"Invalid input \"%s\"\n",str);
        exit(1);
    }

    return ret;
}

static unsigned
get_input(void)
{
    char buf[1024];
    fgets(buf,1024,stdin);
    return interpret_string(buf);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。