long long int真的好神奇(茶
#include
#include
long long int turn(long long int num){
long long int temp=0;
while(num>0){
temp=temp*10+(num%10);
num/=10;
}
return temp;
}
int main( )
{
long long int n;
scanf(\"%lld\",&n);
printf(\"%lld\",turn(n));
system(\"PAUSE\");
return 0;
}
這段希望數字反轉,當全部的long long int改為int時並無錯誤,但是使用long long int時就會出現一大長串數字
希望有人幫忙解決,謝謝ˇ
2006-07-17 18:39:42 · 6 個解答 · 發問者 ? 3 in 電腦與網際網路 ➔ 程式設計
long long int num
這個改為
int num
就沒有問題...但是一定要4294967295這麼大啊(淚
裡面怎麼解決哩?
2006-07-17 18:43:35 · update #1
呃,剛剛嘗試全部改為unsigned int(雖然不太懂這個的意義)
但是數字最大到1234567893,更大就不正常了(這數字是手動式測出來的(炸
2006-07-17 19:05:24 · update #2
請當上個補充不存在(默
總之還是無法解決...
2006-07-17 19:06:44 · update #3
我囧了
想說不管怎樣,雖然數字達不到它的要求,還是放上ACM看看
結果...Accepted
它搞笑嗎?還是我的編譯器有問題啊啊?
但請各位大大們回答這個問題這樣Q_Q"
因為輸入較大數字我用肉眼看答案的確是錯的啊...
2006-07-17 19:19:07 · update #4
抱歉,講話很錯亂
我的意思是,照理論來說,函式
long long int turn(long long int num){
}
應該是可以成立的(可能?),但事實上出來的答案是錯誤的。但若是long long int num改成int num,答案會正確
這邊我不了解,是本來就規定()中不能放入long long int嗎?還是我家編譯器問題?
後來還有增加一個問題,放下邊補充
2006-07-17 20:15:43 · update #5
後來,我將所有都改成unsigned int,這時候,一般的小數字是都對了,但是在理應可接受的最大4294967295數字內,一些10位數(不超過4294967295的),在作函式內
long long int temp=0;
while(num>0){
temp=temp*10+(num%10);
num/=10;
的運算時,答案還是出錯了,為甚麼?
2006-07-17 20:19:20 · update #6
你的意思是…要用程式儲存更大的數值嗎?
要儲存比 unsigned int 還大的數值,最好是使用陣列的演算法來儲存。
儲存大型數值演算法 教學網址:
http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/BigNumber.htm
2006-07-18 00:23:21 補充:
#include
2006-07-18 00:40:29 補充:
long long 這個型態是 64 位元系統使用的,用 32 位元系統使用當然會出錯!
2006-07-18 20:27:43 補充:
我的結論是,不要使用 long long 型態,以求程式的穩定性。
在 32 位元視窗系統下,「不適合」使用 long long 做複雜的數值計算,雖然可以正常顯示部分的數值。我參閱部分的國外論譠,有國外網友提出以組合語言配合 C 或 C++ 做 long long 數值型態的轉換,使 long long 型態數值經 32 位元系統四則運算後顯示出來。
大於 32 位元的有號整數值,雖然可以儲存在 32 位元系統的記憶體內,問題是做四則運算時,系統是以 32 位元的計算方式做運算,一定會「遺失」一部分的整數資料。
我的想法是,做大型數值計算的最簡單方法,是使用「陣列」。
2006-07-17 19:36:41 · answer #1 · answered by Big_John-tw 7 · 0⤊ 0⤋
字數太長, 所以分兩段:
你的問題在於, ACM 上的 long long int 是用 %lld,
但是 Dev-C++ 上則是用 %I64d,
所以你上傳到 ACM 會 Accepted,
但是在 Dev-C++ 會出錯,
因為兩者用的是不一樣的....
2006-07-18 22:27:24 補充:
這個問題用大數的方式來處理,
有點殺雞用牛刀的感覺,
不過要在 Dev-C++ 用 %I64d,
上傳到 ACM 再改成 %lld 又太麻煩,
如果你不介意一定要用 C 來寫,
我建議改用 C++ 的 cin、cout,
原來的 main 變成:
long long int n;
cin >> n;
cout << turn(n);
應該是滿簡單的....
有興趣可以參考我的網頁:
http://www.tcgs.tc.edu.tw/~sagit/cpp/
2006-07-19 01:00:41 補充:
其實我是看了學校的留言板才找過來的,
我的C++網頁, 其實也只是把 scanf、printf 改成用 cin、cout 而已,
沒有提到半點物件導向的東西,
所以已經會C的, 應該很快就可以看懂了....
另外, 我在「美麗C世界」下面加了一個留言板的連結,
以後有問題也可以在那邊問我,
因為其實學校裡知道那個網站的學生,
也只有小貓兩三隻而已,
所以你那篇留言, 應該滿多人都一頭霧水吧.....
2006-07-18 18:27:05 · answer #2 · answered by sagit 1 · 0⤊ 0⤋
這是10018?
2006-07-18 13:40:16 · answer #3 · answered by 易 3 · 0⤊ 0⤋
謝謝各位,因為實在不知道該選哪位好,所以交付投票
希望是懂的人在來投了
2006-07-19 00:31:40 補充:
非常感謝sagit大,您的"ACM 上的 long long int 是用 %lld,
但是 Dev-C++ 上則是用 %I64d"真的是一語點醒夢中(?)人,之前由於使用%lld一直錯誤,就沒完全這樣打好、並傳上ACM,沒想到是因為這樣...
C++的話,因為是完全完全不會的,而且這算是學校的作業,所以想說還是就用C吧
這幾天只要寫到要負數,又要2147483647以上的鐵掛,您的一句話解決了所有問題,非常感謝!
您的網頁,美麗C世界,早被我反覆利用了XD"
昨天還跑去貴校留言版留了言呢˙ˇ˙"
2006-07-18 08:22:18 · answer #4 · answered by ? 3 · 0⤊ 0⤋
#include
#include
#include
// TYPEInt 改成妳要的type
// 如long long int 可在Dev C++ 上用
// __int64 可在VC++ 6.0 上跑(__int64 為VC++6.0 上面的64bit int)
#define TYPEInt long long int
TYPEInt turn(TYPEInt num){
TYPEInt temp=0;
while(num>0){
temp=temp*10+(num%10);
num/=10;
}
return temp;
}
// 把字串轉成TYPEInt
TYPEInt StrToInt(char *a_zInput)
{
TYPEInt temp=0;
for( ; (*a_zInput) != '\0' ; ++a_zInput)
{
if( (*a_zInput) >= '0' && (*a_zInput) <= '9' )
{
temp*=10;
temp+=((*a_zInput)-'0');
}
else break;
}
return temp;
}
char* StrRev(char *o_zStr,unsigned n)
{
char *pS=o_zStr;
char *pE=o_zStr+n-1;
char t;
for( ; pS < pE ; ++pS,--pE )
{
t=*pS;
*pS=*pE;
*pE=t;
}
return o_zStr;
}
// 把TYPEInt 轉成字串
char* IntToStr(TYPEInt a,char *o_zOutput)
{
unsigned n=0;
if( a == 0 )
{
o_zOutput[0]='0';
o_zOutput[1]='\0';
return o_zOutput;
}
while( a!= 0 )
{
o_zOutput[n]='0'+ (a%10);
a/=10;
++n;
}
o_zOutput[n]='\0';
StrRev(o_zOutput,n);
return o_zOutput;
}
int main( )
{
TYPEInt n=0;
char z[100];
char z2[100];
scanf("%s",z);
n=StrToInt(z);
printf("%s",IntToStr(turn(n),z2));
system("PAUSE");
return 0;
}
您的問題並不是因為long long int 的錯誤
是scanf 跟printf 的錯誤. scanf("lld",&n) 跟printf("%lld",n) 並不會正確的讀取(印出)long long int.
(note 因手邊沒有mingw 的help 檔所以無法得知long long int 要用什麼樣的符號)
所以我自己寫了一個StrToInt 跟IntToStr 的function 來互轉long long int 跟字串.
另外
本人使用DEV C++V4.9.9.2
MinGW 為 3.4.2 版
2006-07-18 07:44:16 · answer #5 · answered by SiYu 5 · 0⤊ 0⤋
long long 建議少用..可攜性不高
2006-07-18 07:26:12 · answer #6 · answered by 丹尼爾 4 · 0⤊ 0⤋