用于表示19位数字的整数类型

时间:2015-04-17 19:11:23

标签: c

我的代码出现问题。 我必须做一个计算,但当一个特定的数字变得很大时,它不会打印出正确的答案,我现在使用的是int类型。但我不知道这是不是最好的选择。

这是我的代码:

int faculty(int faculty1)
{

    printf("enter faculty\n");
    scanf("%i", &faculty1); //faculty1 is a number from 1 to 20
    int i;
    int fact = 1;

    for(i=1; i<=faculty1; i++)
    {
         fact *= i;
    }

    return (fact);
}

我可以使用哪种类型来避免教师计算中的溢出?

5 个答案:

答案 0 :(得分:1)

您可能希望使用unsigned long long来存储长度为19位的值。

最大值为18446744073709551615(2 ^ 64-1)或更高*

还要注意格式说明符为%llu

另外

scanf("%i", &faculty1);

应该是

scanf("%d", &faculty1);

如果faculty1是包含19位数字的那个,那么

scanf("%llu", &faculty1);

答案 1 :(得分:1)

您可以使用uintmax_t中定义的stdint.h,它保证是平台上最大的无符号类型。另外,您可以通过CHAR_BIT * sizeof(uintmax_t) * log10(2.0)

查看它提供的位数

答案 2 :(得分:0)

这是错误的:

scanf("%i", &faculty1); //faculty1 is a number from 1 to 20

您希望使用%d,而不是%i - 假设faculty1是1到20之间的整数,并且您想要计算该整数的阶乘。

我假设您不可能打算计算19位数的阶乘。

即使使用unsigned long long,您overflow也会比您的19位数值更快,更快。{/ p>

请澄清您的问题以及您真正想要做的事情。

答案 3 :(得分:0)

以下是需要64位时可以使用的类型列表:

  • long long由标准保证至少为64位。

  • stdint.h中定义的任何适当类型。它们采用int64_tfast64_tleast64_t等形式。int64_t当然正好是64位宽,其他两个保证至少有64位

对于所有这些类型,还有无符号变体(unsigned long longuint64_t等)。只需选择你最喜欢的那个。

答案 4 :(得分:0)

OP清楚地表明他希望最多20的阶乘。你可以使用64位int。

#include <stdio.h>

int main()
{
    long long fact=1;
    int i;
    for(i=1; i<=20; i++) {
        fact *= i;
        printf("%2d! = %lld\n", i, fact);   
    }
    return 0;
}

节目输出:

 1! = 1
 2! = 2
 3! = 6
 4! = 24
 5! = 120
 6! = 720
 7! = 5040
 8! = 40320
 9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000