int 2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
由於在編程過程中常常出現int範圍過小的問題,但是double的精度問題有很麻煩,所以常用long long ,但是重點是我們真的用對了嗎,還是被表面現象欺騙了。
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int x;
while(cin >> x){
long long y = x*x*(x*x+x*x);
cout << y <<endl;
}
return 0;
}
看似這個代碼實現了int 到long long 的轉化,但是實驗發現x的值大概只能輸到180,因爲我被欺騙了,但是
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int x;
while(cin >> x){
long long y = (long long)x*x*(x*x+x*x);
cout << y <<endl;
}
return 0;
}
這個代碼就可以輸入x的值達到十萬左右,兩個代碼的區別在於long long y = (long long)x*x*(x*x+x*x); 沒加long long 的時候根本沒有實現類型轉化,原因是什麼???我不知道!!!但是在編寫很長的代碼的時候,這個問題就會被遺忘,但是往往就是致命點。WRONG ANSWER 20多次是正常滴,還不一定能發現問題。
經過痛苦的調試uva 109之後,我得到了很大的教訓。以後千萬不可忘記。老師的課是有道理的,不然我怎麼也不會知道是這個原因了。