close
標題:

C++語言題目完整解法

發問:

有一個數(x)加上111(X+111)會是一個完平方數,若再加1647(X+111+1647),又會是另一個完全平方數,請問x=?(不只有檔案,需有完整的C++語言寫法) 更新: (答案) 更新 2: 剛剛寫錯了

aa.jpg

 

此文章來自奇摩知識+如有不便請留言告知

最佳解答:

#include #include #include #define LOW 111 #define HIGH (1647+LOW) int main(void) { int a, root, square; for (a=40; ++a
其他解答:

對意見007: 1647 = 3^3 * 61 於是找到因數為1, 3, 9, 27, 61, 183, 549, 1647 也就是b可能的數 俺略加幾句: 因 b(2a+b) = 1647 故 b < 1647^0.5 故b可能的數更限縮至前4個 1,3,9,27 2010-06-13 19:32:39 補充: Jacob 大有句話說錯了,哪句??? 就是「意見 009 才是第一名!」這句說錯了! 俺酒哈多了,打了個酒嗝,隨便扯了幾句009的侈言,,,,,, 俺看了看,10~17 才是第一名,內含玄機,後勁無窮! 建議原始人私下向 Jacob大請益,打通任督二脈! 至若5~8的變因,在因數!這使它變得不穩定,難評估!|||||其實2者都不算很好的演算法 由其是前者次數已經是O(n2)了, 後者是O(n / 2)吧 但事實上套用簡單國中數學的原理可以讓演算法最差為O(根號n) 首先 先套用此公式並且不管一開始加的111 (a + b)^2 = a^2 + 1647 -> a^2 為 X+111, b 為 a 加上一個數後的平方等於a平方加1647 最後可得 b(2a + b) = 1647 2010-06-13 11:42:32 補充: OK, 再來已知a,b均為整數, 所以做法就是找出1647的因數, 先將1647給因數分解 1647 = 3^3 * 61 於是找到因數為1, 3, 9, 27, 61, 183, 549, 1647 也就是b可能的數 再帶回求a值, a^2值, x=a^2 - 111值 過濾掉重覆的結果值即求出 因為我是用java做的, 所以不貼答案 (也不便踼館啦....XD) 2010-06-13 11:43:07 補充: 111,1647 -> 這組數值我的程式執行為43次 111,760625775->這組數值我的程式執行為69次 111,760625773->這組數值執行為18702次 至於有沒有更快的? 有 從因數分解的演算法下手 如果有高手願意補充的話 2010-06-13 20:08:41 補充: 當然以企業角度而言, 求的是考慮到每項因素的最適合解而不是單考慮到演算法次數的最佳解 再以development time及維護的角度而言, 如果再考慮到平均工程師的程度及目標只是區區的4位數字 我上述的那些演算法一定是不及格的, 但我上述的回答也儘限於演算法次數, 需不需要採用真的要看是否會發生數字過大造成程式過慢的情況可能. 2010-06-13 20:09:07 補充: 不過既然被點名了, 那code不貼出來還真的說不過去 (順便感謝一下, 已加了009意見) http://tw.myblog.yahoo.com/tristezza-dolor/article?mid=12&prev=-1&next=-1 2010-06-13 20:13:51 補充: 至於次數的話, 已說明最差的狀況為Sqrt(N) (實際上會多加一點點), RAM使用量最差狀況為 N=2^n development 狀況最差狀況為-工程師看不懂在寫"尛"|||||To 發問者: 這兩位回答者的解法都正確,也都有說明。 程式的長短、速度的快慢,已說明其好壞。 知識+ 的定義是:最佳解答。 請給予符合定義的選擇,讓 好的回答者得到應得的 後人看到這題,很容易看到好的做法。 如果你把最佳解答給了較差的, 要是引起公憤,來了一堆負評, 你 和 較差的最佳解答,都會被扣點!! 你希望這樣嗎? ==== 2010-06-13 06:01:01 補充: To 回答者 001 根據你之前問過的二題: http://knowledge.yahoo.com.tw/question/question?qid=1010060602064 http://knowledge.yahoo.com.tw/question/question?qid=1010052303237 你今年國二,學了C語言的一點皮毛。 能有這樣的本領,已算不錯! 你應該有點印象: 『國一數學明顯比小六的難!』吧? 告訴你: 1. 高一數學明顯比國三的難! 2. 高二數學明顯比高一的難! 2. 大一數學明顯比高三的難!(問題較簡單,觀念較難) 3. 大二數學明顯比大一的難! 2010-06-13 06:01:44 補充: 而, 大二的數學,在數學的領域裡,是小小小小兒科! 1960年代,大家還在考慮的是: 資工該不該獨立成為一個系? 還是它仍應該只是數學系的一個組? 也就是說: 沒有數學,就沒有好的程式! 你才國二,數學再好都不可能真的很好! 程式上能有這樣的表現,勇氣可佳! 最後能認輸,再次證明你勇氣可佳! 但,中間數落了人,就不應該了!! 尤其是:國二,約14歲,口氣這麼大,真的不好!! 希望你從這題,可以〝再〞學到: 1. 對別人的尊重。 2. 人外有人,天外有天! 在知識+ 確定有比我強的程式師! 而台灣最強的程式師,應該沒在知識+ 活動! 世界最強的程式師,應該不在台灣! 2010-06-13 06:01:59 補充: 3. 演算法的重要! 你的程式花了半小時,他的程式花了不到一秒! 看起來約是 0.5 * 60 * 60 / 1 = 1800 倍! 你可知,要是這題改成 1111 和 16477(長大約10倍), 我估 002 會是你的 1800 * 10^2 * 1.5 = 25萬 倍快!甚至更多! 因此,建議你: 1. 好好顧好功課!才能學到更多! 2. 好好學尊重人!才有更多高手願意教你! 我高一時,程式還沒才國二的你強呢! 加油! ^_^ 2010-06-13 17:03:47 補充: 個人〝認為〞〝目前為止〞,〝這題〞最好的演算法是原始人法。 而這題也沒指名:要最好〝演算法〞! 也就是說:應該是要:最好程式。 關於 Time Complexity, 回答 001 的是 O(n^2) with a large hidden constant, but not very large 回答 002 的是 O(n^0.5) with a small hidden constant 意見 5~8 的 Big-O 不易〝看〞出,可能要找一下課本對照。估約 O(n^0.15) ==== 2010-06-13 17:05:09 補充: 問:為何 002 是 O(n^0.5)? 答:輸入範圍是1~n,用了 a*a 的 a 當 loop index,且沒有 inner loop! 當然是 O(n^0.5) 問:那,為何 001 是 O(n^2)? 答:輸入範圍是1~n,用了 1 ~ n 當 loop index,己經是 n 它有 inner loop!是 1~x!簡言之,又是個 n 所以,是個 O(n^2) 裡面還有 loop 呢! 所以,判它 O(n^2) 已是低估!! 說它是 O(n^2.5)、甚至 O(n^3) 都不為過! 問:怎知 001 的 hidden constant 不小? 答:有了一堆除法(及 if)怎會小? 2010-06-13 17:06:44 補充: 問:怎知 002 的 hidden constant 很小? 答:每個 iteration 〝只〞有 一個 inc、乘法、減法,sqrt 二個 assign, cmp、cast 怎會大? 問:5~8 的 Big-O 為何看不出? 答:要先找到 N的因數個數 與 N的〝漸近〞曲線! 而這〝曲線〞本身是個折幅不小的折線!(參意見008的數據) 這漸近曲線絕對不是 根號 N!而是比根號 N小不少的東西。 ==== 2010-06-13 17:09:05 補充: 問:0.15 < 0.5 < 2,優勝劣敗已明!為何仍認為 002 最好? 答:別漏看了我強調的東西:〝這題〞! 若為演伸題(16477、760625773),5~8 是最好的。 所有高速演算法都有相同的一個問題: 在低資料量時,比低速演算法慢! 〝這題〞不到 68萬,不是很大的資料! 而由一開始的 a*a 變成 a(及其它), 002 已將資料量降到 800以下(729)! 應算是小資料量! 所以,002 的執行速度〝不一定〞輸 5~8 問:就算只看這題,我認為 5~8 仍優於 002耶! 答:002 已降到不到 0.5秒,就算 5~8 是 0.0001 秒, 你認為真的有比較好? 2010-06-13 17:12:10 補充: 問:就算這樣,我還是覺得5~8比較好! 答:演算法的優劣有多個項目要考慮,不是只有執行速度! 如:用 RAM 量也是其中之一!(這題這不重要!) 就用RAM量而言,5~8 是三者最差的!(在這題,這真的很不重要!) 這裡提出一個〝略〞有評定價值的參考標準:(用RAM量在這題就是沒有價值的標準!) 5~8 我沒寫下 hidden constant!它的 hidden constant 很大!! 再參考意見008的數據, 也就是說:1647它雖只有43次,不保證(如)3969不會變成100次! (如意見008,才差2!) (說到這裡,意見008的數據 2, 3 有沒有寫相反了?) 2010-06-13 17:13:58 補充: 在 100次的情況下,配上大的 hidden constant,5~8是會輸給 002 的! 也就是說:雖然1647只有43次,並不能代表:四位數下,5~8較好! 花在判斷、賭運氣上的時間,可能這兩個演算法都已算出答案了! ==== 而,就程式好壞而言,不是只有演算法! A. 可讀性、可維護性 002 的程式 在沒共用變數下,只有三個變數 在沒壓擠進一列的情況下,只有五列 5~8 能有意見 008,Java 程式應該已經出爐。 不知可否分享變數量、列數? 個人認為:應該沒辦法在 6 / 10 (兩倍量)內辦到 在 run-time 同是不到半秒的情況下,5~8在此算是輸掉了。 2010-06-13 17:14:58 補充: B. 開發時間! 一般都會知道:compile time, run time; 但,在研究、論文、工業上,development time 都是一重要考量! 就同是不到 半秒的 run-time 而言, 如果 5~8的 development time 不能在 002 的一半以內,恐怕該算輸。 ==== 但,若要有演伸題,5~8仍是第二名! Jacob!你太過份了! 002 怎可能在演伸題上還贏 5~8? 別生氣!!我還沒講完嘛!! 意見 009 才是第一名!XD 2010-06-13 17:23:15 補充: 不好意思!上一意見(016)最開始有重大錯誤! 如果 5~8的 development time 不能在 002 的〝一半〞以內,恐怕該算輸。 應該是 如果 5~8的 development time 不能在 002 的〝兩倍〞以內,恐怕該算輸。 2010-06-14 22:15:22 補充: 意見 005 和 009 用的都是國中數學! 所以,國中數學還是很重要的! 以後的數學,威力就更大了!! 加油!^_^|||||我先說說我的構想好了 首先x從1開始遞增 檢視每一個數 所以你的意思是加上111和1758皆可形成平方數? #include "stdafx.h" #include "stdio.h" #include "stdlib.h" int main() { int x=-111; //x由111開始 因負數不可能是完全平方數 while(true) { x++; //x的值+1 以便檢驗下一個數 for(int k=1;k<=x+111;k++)//將X+111除以任何一個比他小的整數 { if((x+111)/k==k)//可以被一個整數除且商又是那個整數 為完全平方數 { for(int i=1;i<=x+1758;i++)//檢驗x+1758是否也是全平方數 { if((x+1758)/i==i) printf("%d ",x);//又是完全平方數 所以顯示出來 } } } } system("pause"); return 0; } 2010-06-13 03:18:55 補充: 剛剛那個程式請無視!! 我貼錯了!!! 以下的才是正確的!! 2010-06-13 03:19:28 補充: #include "stdafx.h" #include "stdio.h" #include "stdlib.h" 2010-06-13 03:19:37 補充: int main() { int x=-111; //x由111開始 因負數不可能是完全平方數 while(true) 2010-06-13 03:19:45 補充: { x++; //x的值+1 以便檢驗下一個數 for(int k=1;k<=x+111;k++)//將X+111除以任何一個比他小的整數 { 2010-06-13 03:19:56 補充: if(((x+111)/k==k)&&((x+111)%k==0))//可以被一個整數除且商又是那個整數 為完全平方數 { for(int i=1;i<=x+1758;i++)//檢驗x+1758是否也是全平方數 2010-06-13 03:20:10 補充: { if(((x+1758)/i==i)&&((x+1758)%i==0)) printf("%d ",x);//又是完全平方數 所以顯示出來 2010-06-13 03:20:18 補充: } } } } system("pause"); return 0; } 2010-06-13 03:23:49 補充: 根據我跑了5分鐘的結果 首先立刻跳出 178 7458 然後過了10秒左右 跳出 74418 到現在都還沒有別的數跳出來 (主機風扇很大聲 證明他仍然有在跑) 話說這花了我好久的時間... 2010-06-13 03:27:15 補充: 回答002... 我真的想說... 如果你用那些函式他看得懂我花這麼多時間做甚麼阿XDD 更何況你沒加上註解... 題目想要的X也沒回答阿 "有一個數(x)加上111(X+111)會是一個完平方數,若再加1647(X+111+1647),又會是另一個完全平方數,請問x=?" 2010-06-13 05:09:03 補充: 甘拜下風!! 我花了接近半小時才找到 178 7458 74418 677218 最佳解答就給他吧!! 2010-06-14 18:54:25 補充: 謝謝大家的評論 不過 我看到二十幾個意見真的下了一跳呢 很感謝 Jacob Lee 的指導 讓我如醍醐灌頂 受益良多BFC66BE0445C3814
arrow
arrow

    ddhdxb5 發表在 痞客邦 留言(0) 人氣()