[問題] c++ 如何不用array記憶數字

看板C_and_CPP作者 (Qmmmmmmmmm)時間14年前 (2011/10/08 02:59), 編輯推噓8(8037)
留言45則, 10人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) c++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 小弟剛學c++,教授出了一題作業: (請勿跟我說網路上有一堆解答,我想靠自己寫出來,除非逼不得已.. 像是現在,真的想不到時才想上來問問各位高手,請求各位給予點"提示、指引") 「已知有N個棒子(可能等長),請問可以圍成最大邊長的三角形的組合為何?」 教授當時在黑板上舉的例子是: 「2.5.10.3.7.24.8」這些數字中,能夠組成三角形且有最大周長的是? 我的邏輯是,先從最大的看,所以先將數列按照大小排序 「2.3.5.7.8.10.10.24」 接著從前三大的開始檢驗是否滿足三角不等式(任兩邊和大於第三邊) 所以答案就是8.10.10了,因此我接下來的程式按照這邏輯去寫.. 我們目前只學了if..else、for、switch、&&、||、cin.get()、以及一些 很基本的概念,沒學過array。 教授出的這題,「N個正數」似乎可以是由鍵盤輸入,而不是事先在程式碼內打好。 我已經有了些想法,就是利用3個固定的變數以及1個儲存剛輸入的數字的變數, 用這四個變數來測試是否滿足triangle inequality以及符合三角不等式且 有最大邊長的邊長組合。但我遇到了瓶頸... 希望高人給予指點,只需要給小弟一些提示就好了,謝謝! ==我的問題== 看完程式碼後,應該可以理解我主要有三個變數abc 若已儲存的a、b、c(a>b>c)不滿足三角不等式,接著輸入的x也竟然讓這 四個數字湊不出三個可滿足三角不等式的數字,此時勢必要把這四個數字 都存在電腦裡,否則接下來第五個數字一輸入時,也許就會得出滿足不等式 的組合,但也有可能不滿足...依此類推就會發現...好像一定要用array來 儲存數字了,但是我沒學過而且也想試試看,看看有沒有辦法不用array就 做出來,以教授的講法,似乎是有辦法做到.. 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/qoZ941tt 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.249.233

10/08 03:05, , 1F
a、b、c三個變數不一定要a>b>c吧?任意三個就好了
10/08 03:05, 1F
恩,因為如果我將儲存的abc按照大小排序,那麼就可以只看b+c>a就好了。

10/08 03:09, , 2F
照這樣來看的話不會有不成立的情況吧
10/08 03:09, 2F

10/08 03:10, , 3F
抱歉我傻了,a=b+c就不符合了
10/08 03:10, 3F

10/08 03:10, , 4F
遇到這個情況新輸入的數值就可以蓋掉跟原本一樣的數
10/08 03:10, 4F

10/08 03:11, , 5F
值了,如果不符合也可以把最小的那個蓋掉,這樣用四
10/08 03:11, 5F

10/08 03:11, , 6F
個變數就可以完成了
10/08 03:11, 6F
我怕的是..像是這樣 1(c) 1(b) 80(x) 90(a) 如果把1(c)蓋掉,接著我卻輸入1,那麼滿足不等式且有最大周長的將會是 原本的1(c) 1(b) 再加上最新輸入的1 所以我就不敢把最小的蓋掉了...

10/08 03:12, , 7F
結論就是如果原本就不符合,那輸入的就把最小的覆蓋
10/08 03:12, 7F

10/08 03:13, , 8F
如果原本符合,但新輸入的會造成不符合,就不要管
10/08 03:13, 8F

10/08 03:16, , 9F
抱歉...我看不太懂你打的=.=
10/08 03:16, 9F

10/08 03:16, , 10F
好像不行把最小的丟掉
10/08 03:16, 10F

10/08 03:17, , 11F
你原本是1,1,90,在輸入80就變成1,80,90,如果又輸入
10/08 03:17, 11F

10/08 03:17, , 12F
例如數列是 1 1 3 5 9 15 1 這樣輸入
10/08 03:17, 12F

10/08 03:17, , 13F
1的話就變成1,80,90不是一樣嗎?
10/08 03:17, 13F
對不起QQ 是我沒把題目說清楚 那N個數列其實是來自於N根棒子,棒子有長有短, 換句話說數列中可以有同樣大小的數字,只不過現在這數列是可以由鍵盤輸入的。

10/08 03:18, , 14F
不是一定要把最小的覆蓋,而是要用if判斷,是否有更
10/08 03:18, 14F

10/08 03:19, , 15F
大產生,如果會產生更大的才覆蓋
10/08 03:19, 15F
是的,我程式碼前面的(x>=a)的用意就是這個,但如果一直沒遇到更大的就不知道該怎辦了

10/08 03:19, , 16F
新輸入的不能不管,考慮(2 2 3) (200 200 300)
10/08 03:19, 16F

10/08 03:21, , 17F
實在話,不用 array 我認為不合理.
10/08 03:21, 17F
當時教授只說: 「From the triangle problem you can appreciate the invention of array. You first need to discover the general mechanism which can solve "n" sticks. Then you start to write the program. 」 囧,我們是真的沒學過array..但如果一定要用array,那麼教授下面那句就怪怪的了。 言下之意是我們能夠不用array而寫出來。 不過還有一個可能,就是「可以把那N個數字的來源改為已事先在程式碼中打好」 (但如何將“N”個數字事先在程式碼中打好呢?N is an unknown number.)

10/08 03:21, , 18F
(2 2 3) (0.2 0.2 0.3) (2000 2000 3000)
10/08 03:21, 18F

10/08 03:22, , 19F
很容易就把可能是最佳解的組合給丟掉.
10/08 03:22, 19F

10/08 03:23, , 20F
輸入是一次一個輸入,並不是一次一組三個一起輸入
10/08 03:23, 20F

10/08 03:23, , 21F
應該是不會miss掉最佳解
10/08 03:23, 21F

10/08 03:23, , 22F
一直沒遇到更大的...就輸出error吧= =
10/08 03:23, 22F

10/08 03:24, , 23F
我的意思是, 輸入打亂上列數列,括號是方便看
10/08 03:24, 23F
我的問題就是您說的這個...想了好久O.O

10/08 03:24, , 24F
如果目前找到的是 (2 2 3),出現了 2000,這替代原有數字
10/08 03:24, 24F

10/08 03:24, , 25F
原來...抱歉誤會了
10/08 03:24, 25F

10/08 03:25, , 26F
根本就組不成三角型,接下來2000捨掉,不就捨掉最佳解了?
10/08 03:25, 26F

10/08 03:27, , 27F
實在話,看過不少教授還沒教array,最後作業卻要用array,
10/08 03:27, 27F

10/08 03:27, , 28F
這是常有的事.
10/08 03:27, 28F
我也不清楚,但那時我們有特別問,他是說不用array..

10/08 03:28, , 29F
何掉你說的 n 個數在程式碼打好,我想是這種型式 :
10/08 03:28, 29F

10/08 03:29, , 30F
int arr[]={1,2,3,4,5} , n=sizeof(arr)/sizeof(*arr);
10/08 03:29, 30F

10/08 03:29, , 31F
原來我誤會了三角不等式...
10/08 03:29, 31F

10/08 03:30, , 32F
用一個string存...
10/08 03:30, 32F
※ 編輯: Qmmmmnn 來自: 140.112.249.233 (10/08 03:32)

10/08 10:17, , 33F
我的話會用new吧,然後把資料排序,再來從最大數往前
10/08 10:17, 33F

10/08 10:18, , 34F
數三個,如果前兩個和大於第一個,那麼就顯示出來,
10/08 10:18, 34F

10/08 10:18, , 35F
否則繼續往前數三個~~
10/08 10:18, 35F

10/08 10:40, , 36F
出這種題目是非常無聊沒意義的。浪費學生的時間寫作業罷了
10/08 10:40, 36F

10/08 10:41, , 37F
出作業的目的應該是為了讓學生了解c++的寫程式邏輯和語法,
10/08 10:41, 37F

10/08 12:38, , 38F
....用stack(遞迴)不行嗎?
10/08 12:38, 38F

10/08 12:40, , 39F
似乎是不行....囧
10/08 12:40, 39F

10/08 12:48, , 40F
不用array, 就用一堆變數啊
10/08 12:48, 40F

10/08 12:51, , 41F
他應該是要你們先痛過, 然後才知道array的好 在哪裡.
10/08 12:51, 41F

10/08 13:52, , 42F
那只好用指標和 malloc了 (逃
10/08 13:52, 42F

10/08 15:37, , 43F
用vector(大誤
10/08 15:37, 43F

10/08 15:41, , 44F
突然發現有想到的vector,map,string都有偷用array...
10/08 15:41, 44F

10/08 16:46, , 45F
那就只好用linked list了 沒有array XDD
10/08 16:46, 45F
文章代碼(AID): #1EZqmkbG (C_and_CPP)