首先:ANSI C99标准中并没有64位整数类型。其次,许多实际的编译器,都实现了对64位整数类型的支持。
具体的分析,参见:http://blog.csdn.net/lychee007/archive/2010/04/04/5449237.aspx
其中关键是这个表格:
变量定义 | 输出方式 | gcc(mingw32) | g++(mingw32) | gcc(linux i386) | g++(linux i386) | MicrosoftVisual C++ 6.0 |
---|---|---|---|---|---|---|
long long | “%lld” | 错误 | 错误 | 正确 | 正确 | 无法编译 |
long long | “%I64d” | 正确 | 正确 | 错误 | 错误 | 无法编译 |
__int64 | “lld” | 错误 | 错误 | 无法编译 | 无法编译 | 错误 |
__int64 | “%I64d” | 正确 | 正确 | 无法编译 | 无法编译 | 正确 |
long long | cout | 非C++ | 正确 | 非C++ | 正确 | 无法编译 |
__int64 | cout | 非C++ | 正确 | 非C++ | 无法编译 | 无法编译 |
long long | printint64() | 正确 | 正确 | 正确 | 正确 | 无法编译 |
我们注意到,VC++ 6.0对64位整数的支持是最“那个”的。
重新给出书中的代码:2.4.3 64位整数
题目:输入正整数,统计它的正因子个数。n<=(10的12次方)
标准C语言的解法:
编译器:TCC(基本上就是C99的国际标准,可厉害了!)
0001 /* 0002 2.4.3,64位整数 0003 例子 0004 输入正整数n,统计它的正因子个数 0005 n<=(10的12次方) 0006 0007 解题思路: 0008 穷举法,从1开始,穷举每个可能的因子x;对于满足条件(n%x==0)的,将计数器count增量1 0009 穷举的技巧: 0010 只需要穷举[1..sqrt(n)]的范围即可; 0011 如果x是n的因子,那么(n/x)也是n的因子。 0012 0013 0014 */ 0015 # include "stdio.h" 0016 # include "math.h" 0017 void main() { 0018 long long n, 0019 x, /*假设的因子*/ 0020 count=0; /*计数器*/ 0021 0022 scanf("%I64d",&n); 0023 for (x=1; x<=(long long)sqrt(n); x=x+1) { 0024 if (n%x==0) { 0025 count=count+2; /*之所以+2,是因为x和(n/x)都是n的因子*/ 0026 /* printf("%I64d\n",x); */ 0027 if (n/x==x) count=count-1; 0028 } 0029 } 0030 printf("因子个数:%I64d",count); 0031 0032 return; 0033 }
上述代码写得本身没有什么问题,但是在VC++ 6.0中编译时,会被告知:
……test.c(4) : error C2632: 'long' followed by 'long' is illegal
这就是VC++ 6.0不能识别 long long 的明证!
那么,VC++ 6.0要如何完成上述代码中所需的64位整数呢?
请看下面的代码:(唯一的秘诀就是把 long long 改成 __int64;注意:int64 的左边有两个下划线哦!)
0001 # include "stdio.h" 0002 # include "math.h" 0003 void main() { 0004 __int64 n, 0005 x, /*假设的因子*/ 0006 count=0; /*计数器*/ 0007 0008 scanf("%I64d",&n); 0009 printf("%I64d",n); 0010 for (x=1; x<=(__int64)sqrt(n); x=x+1) { 0011 if (n%x==0) { 0012 count=count+2; /*之所以+2,是因为x和(n/x)都是n的因子*/ 0013 /* printf("%I64d\n",x); */ 0014 if (n/x==x) count=count-1; 0015 } 0016 } 0017 printf("因子个数:%I64d",count); 0018 return; 0019 }
请注意,上述代码,均可以正确处理10的12次方以内的超大整数的数据输入。
不信?你试试看!