[問題] Inversion Count 輸出錯誤

看板C_and_CPP (C/C++)作者 (閒人)時間12年前 (2013/12/06 22:26), 編輯推噓6(6023)
留言29則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Dev C++ 4.9.9.2 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) N 問題(Question): 輸出錯誤 餵入的資料(Input): 3 3 1 2 (開一個有3個空間的array,依序讀入3、1、2這3個Integer) 預期的正確結果(Expected Output): 2 (找出(3,1)、(3,2)這兩個i<j、但A[i]>A[j]的pair) 錯誤結果(Wrong Output): 268....(閃太快看不清楚) 程式碼(Code):(請善用置底文網頁, 記得排版) http://paste.plurk.com/show/1738435/ (old http://paste.plurk.com/show/1738728/ (new http://paste.plurk.com/show/1738771/ (第三版,錯誤太多可不看 http://paste.plurk.com/show/1738885/ (最終版 補充說明(Supplement): 這題是老師出的三題作業中個人唯一有頭緒的兩題之一, 只是不知道為何出現出乎預期之外的結果。 也希望大家可給小弟意見使小弟寫出能跑出符合預期結果的程式碼。 在此先感謝各位了。<(_ _)> 12/6 在此按照CCWck和yvb大大的意見宿改個人程式碼後, InvCount回傳的數字還是上面的錯誤訊息................... 12/7 把涵式宣告部分做了些小修正(雖然不知是否對錯) 只是run出來還是一樣的錯誤.......orz....... 感謝yvb大大提供的看內部值方式,正在看值變化來尋找bug中<(_ _)> 最終版本出來了,再來麻煩的只剩下把輸入20次一堆值得時間壓到10秒內ˊ_>ˋ 感謝各位大大幫忙。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.136.212.218

12/06 22:37, , 1F
陣列的size 不能等到input時才決定
12/06 22:37, 1F

12/06 22:39, , 2F
我也想寫死阿,問題題目是要讓人丟值來決定給幾個array
12/06 22:39, 2F

12/06 22:40, , 3F
空間,另外,丟我水球(還是短訊?反正是星號玩意)的同學
12/06 22:40, 3F

12/06 22:41, , 4F
你答對了,只是我不會用那功能+個人coding能力不強.orz
12/06 22:41, 4F

12/06 22:43, , 5F
你可以找一下動態配置陣列的用法 關鍵字new
12/06 22:43, 5F

12/06 22:46, , 6F
多謝
12/06 22:46, 6F

12/06 22:58, , 7F
就算加了new的用法還是一樣問題................
12/06 22:58, 7F

12/07 00:58, , 8F
main() 中的 count 請看置底十三誡之第1誡.
12/07 00:58, 8F

12/07 01:02, , 9F
main() 應該是想印出 InvCount() 的回傳值?
12/07 01:02, 9F

12/07 01:03, , 10F
因 InvCount() 和 invMerge() 的參數 count 是 call by value.
12/07 01:03, 10F

12/07 01:58, , 11F
話說C99支援variable-length-array(VLA),C++14也可能跟進.
12/07 01:58, 11F

12/07 02:04, , 12F
使用 GNU g++ 時, int A[a] 可以用就是; Dev C++ 就不清楚了.
12/07 02:04, 12F
※ 編輯: thunder956 來自: 220.136.212.218 (12/07 08:27)

12/07 10:05, , 13F
新版 上面的函數宣告 和 下面的函數定義, 最後一個參數不一致.
12/07 10:05, 13F

12/07 10:08, , 14F
其實你舊版可能只要改 main() 中呼叫 InvCount() 那一列:
12/07 10:08, 14F

12/07 10:09, , 15F
count=InvCount(A,0,a-1,0);
12/07 10:09, 15F

12/07 10:14, , 16F
就解決第1誡的問題 (但 count 是在幹嘛的? :P).
12/07 10:14, 16F
count是用於計算在A陣列中i<j,但陣列i,j內數字A[i]>A[j]的部分 其實count部分我比較想用全域變數來宣告,但這麼做會一直compile error 只能改成用call by value的方式了.....orz

12/07 10:17, , 17F
如果是新版的方式, 那下面兩函數的回傳值又是幹嘛的?
12/07 10:17, 17F
※ 編輯: thunder956 來自: 220.136.212.218 (12/07 10:27)

12/07 10:24, , 18F
新版 函數的第一個參數, 宣告/定義 也和 呼叫 不一致.
12/07 10:24, 18F
輸入為4 4 3 1 2 可找出(4,3) ,(4,1),(4,2),(3,1),(3,2) 預期count為 5 只是我在3 3 1 2 這邊就噴了........orz ※ 編輯: thunder956 來自: 220.136.212.218 (12/07 10:55) ※ 編輯: thunder956 來自: 220.136.212.218 (12/07 12:27)

12/07 12:55, , 19F
判斷錯
12/07 12:55, 19F
※ 編輯: thunder956 來自: 220.136.212.218 (12/07 15:14)

12/07 15:56, , 20F
你第4版還是有問題啊... 至少 4 4 3 1 2 就是錯的吧.
12/07 15:56, 20F

12/07 15:58, , 21F
還有,invMerge() 的 int B[r-p] => int B[r-p+1];
12/07 15:58, 21F

12/07 15:59, , 22F
以及最後 copy B 回 A 漏掉最後一個.
12/07 15:59, 22F

12/07 16:02, , 23F
另外, count 看來根本不需當參數傳入,只要在 invMerge()
12/07 16:02, 23F

12/07 16:02, , 24F
使用 int count=0 做為 local variable 即可.
12/07 16:02, 24F

12/07 16:06, , 25F
還有,如果 a 的值可能很大,還是使用 new 及 delete 去做吧,
12/07 16:06, 25F

12/07 16:15, , 26F
畢竟 local variable 放 stack 中, 大小還蠻有限制的.
12/07 16:15, 26F
4 4 3 1 2這部分暫時是無解,畢竟當我把count = InvCount(A,0,a-1);a-1內的-1去掉和 int B[r-p+1]中的+1去掉後用除錯功能一步一步看,count是正確的5 ,當取消除錯功能後,就爆成7了,這部分還需要研究....orz.......... ※ 編輯: thunder956 來自: 220.136.212.218 (12/07 20:52)

12/08 22:31, , 27F
第4版無法正確計算出結果的問題, 都出在invMerge().
12/08 22:31, 27F

12/08 22:32, , 28F
除了前面所提 B 宣告的大小, return 前 copy B 回 A 的長度外,
12/08 22:32, 28F

12/08 22:39, , 29F
最主要的是 count += r - m; 這列放錯地方. 自行驗證一下吧.
12/08 22:39, 29F
文章代碼(AID): #1IeTw3CO (C_and_CPP)
文章代碼(AID): #1IeTw3CO (C_and_CPP)