4. linux调用文件计算阶乘前n项和_【OI noob】阶乘问题

 题目

094fee9cfd44c971759f8b6efc8ffe05.png

 代码

  1. #include<bits/stdc++.h>

  2. usingnamespace std;

  3. int f(int n)

  4. {

    1. if(n<=0)

    2. {

    3. return 1;

    4. }

    5. return n*f(n-1);

  5. }

  6. int main()

  7. {

    1. int n;

  8. cin>>n;

    1. int m = f(n)%1007;

  9. cout<< m<<endl;

    1. return0;

  10. }

这个代码只得了 60 分,Why?

问题还是出现在数据类型上,int可以表示的最大的数为 2147483647,而20的阶乘是 2192834560,已经超出了 int 的范围,所以应该修改阶乘函数的返回值类型。

试着在 OJ 系统上将 int 换成了 long,则AC通过。

在本机上运行时,发现返回值是负数,有点迷惑,写了下面的代码来分析。

 代码

  1. #include<bits/stdc++.h>

  2. usingnamespace std;

  3. long f(int n)

  4. {

  5. if(n==0)

  6. {

  7. return1;

  8. }

  9. return n*f(n-1);

  10. }

  11. int main()

  12. {

  13. int n;

  14. printf("int 可以表示的最大的数为\n%d\n", INT_MAX);

  15. printf("long 可以表示的最大的数为\n%ld\n", LONG_MAX);

  16. printf("long long 可以表示的最大的数为\n%lld\n", LLONG_MAX);

  17. printf("unsigned long long 可以表示的最大的数为\n%llu\n", ULLONG_MAX);

  18. printf("你要计算前几个数?(q to quit):\n");

  19. while(scanf("%d",&n)==1)

  20. {

  21. if(n <0)

  22. printf("无效的数字\n");

  23. else

  24. {

  25. printf("前%d 个数的阶乘是\n%lld\n", n, f(n));

  26. }

  27. }

  28. return0;

  29. }

以上程序的运行输出如下:

int可以表示的最大的数为

2147483647

long可以表示的最大的数为

2147483647

longlong可以表示的最大的数为

9223372036854775807

unsignedlonglong可以表示的最大的数为

18446744073709551615

你要计算前几个数?(q to quit):

20

前20个数的阶乘是

2192834560

+

 问题分析

也就是说,我本机的编译器中,int 和 long 的数据范围是一样的,而在我使用的 oj 系统上是不一样的,因此此处保险的策略是将阶乘函数的返回值写成 long long。 下面进行了一点点深入的分析。

 long 类型的长度

数据类型的字节数应该是由CPU决定的。

对于C语言的int,无论是32位编译器还是64位,都是4个字节。long类型在32位编译器是4个字节,64位是8个字节。

宏LONG_MAX和LLONG_MAX均存在于头文件limits.h中,分别表示long int 和long long int类型的最大值。

Dev C++ 的安装目录中,也能找到 limits.h,内容如下:

  1. #define PATH_MAX 260

  2. #define CHAR_BIT 8

  3. #define SCHAR_MIN (-128)

  4. #define SCHAR_MAX 127

  5. #define UCHAR_MAX 0xff

  6. #define CHAR_MIN SCHAR_MIN

  7. #define CHAR_MAX SCHAR_MAX

  8. #define MB_LEN_MAX 5

  9. #define SHRT_MIN (-32768)

  10. #define SHRT_MAX 32767

  11. #define USHRT_MAX 0xffffU

  12. #define INT_MIN (-2147483647-1)

  13. #define INT_MAX 2147483647

  14. #define UINT_MAX 0xffffffffU

  15. #define LONG_MIN (-2147483647L-1)

  16. #define LONG_MAX 2147483647L

  17. #define ULONG_MAX 0xffffffffUL

  18. #define LLONG_MAX 9223372036854775807ll

  19. #define LLONG_MIN (-9223372036854775807ll-1)

  20. #define ULLONG_MAX 0xffffffffffffffffull

  21. #define _I8_MIN (-127-1)

  22. #define _I8_MAX 127

  23. #define _UI8_MAX 0xffu

  24. #define _I16_MIN (-32767-1)

  25. #define _I16_MAX 32767

  26. #define _UI16_MAX 0xffffu

  27. #define _I32_MIN (-2147483647-1)

  28. #define _I32_MAX 2147483647

  29. #define _UI32_MAX 0xffffffffu

  30. #if defined(__GNUC__)

  31. #undef LONG_LONG_MAX

  32. #define LONG_LONG_MAX 9223372036854775807ll

  33. #undef LONG_LONG_MIN

  34. #define LONG_LONG_MIN (-LONG_LONG_MAX-1)

  35. #undef ULONG_LONG_MAX

  36. #define ULONG_LONG_MAX (2ull* LONG_LONG_MAX +1ull)

  37. #endif

  38. #define _I64_MIN (-9223372036854775807ll-1)

  39. #define _I64_MAX 9223372036854775807ll

  40. #define _UI64_MAX 0xffffffffffffffffull

也就是说,Dev C++ 是 32 位编译器。

 数据类型范围速查表

char             -128 ~ +127        (1 Byte)    short             -32767 ~ + 32768    (2 Bytes)   3*10^4unsigned short     0 ~ 65536        (2 Bytes)    6*10^4int             -2147483648 ~ +2147483647   (4 Bytes)    2*10^9unsigned int         0 ~ 4294967295    (4 Bytes)       4*10^9long == intlong long         -9223372036854775808 ~ +9223372036854775807    (8 Bytes)      9*10^18double         1.7 * 10^308        (8 Bytes)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值