首先: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增量10009 窮舉的技巧: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次方以內的超大整數的資料輸入。
不信?你試試看!