我的代码出现问题。
我必须做一个计算,但当一个特定的数字变得很大时,它不会打印出正确的答案,我现在使用的是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);
}
我可以使用哪种类型来避免教师计算中的溢出?
答案 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_t
,fast64_t
,least64_t
等形式。int64_t
当然正好是64位宽,其他两个保证至少有64位
对于所有这些类型,还有无符号变体(unsigned long long
或uint64_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