我來給你說個思路吧,不會給你寫程式碼的,最多是虛擬碼……
首先你需要一個能夠找到在給定區域內所有完全平方數的函式,不妨稱之為
int* find_squres(int a, int b) {…}
沒錯,它返回一個數組的指標指向a到b之間第一個也是最小一個完全平均數,長度為找到的完全平方數如果沒有,可以返回空指標。如果在函式外不能立即知道該陣列長度,你可以把第一位也就是第0位用來記錄找到的完全平方數個數,如果找不到就返回一個長度為1的陣列,這個位置存個0。
這個函式可能對於a b相距較遠的情況會很費時,所以有必要在本地維護一個檔案用以儲存找到的完全平方數。這個檔案規範如下,記錄從1開始,一直到一個大整數N,所有記錄的數全部是順序的完全平均數,不要漏!
我們寫一個叫做
square_decompose(int M)
的函式用來完成指定任務,演算法從這裡正式開始!
在square_decompose中,開啟那個檔案,把檔案中所有的完全平方數用一個數組X存下來
1. 對於每一個輸入的整數M,比較X中最大的N。
2. 如果N小,則呼叫 find_squares( N , M ),將找到的結果全部append到X裡去。
3. 在X裡從最大值往下尋找第一個比M小的整數,N_1,記錄 M_1 = M-N_1,並把N_1記錄下來(記錄方法太多了,比如記錄在檔案裡,列印在終端,或者和其他返回值一起合併成一個數組返回)
4. 若M_1大於零,遞迴呼叫 square_decompose(M_1);若等於零,把X存入檔案,不要append,並退出。
這樣做是非常快的演算法了……速度提升的訣竅在於維護了一張完全平方數表,如果可以提升尋找完全平方數演算法的話,還能更快!
我來給你說個思路吧,不會給你寫程式碼的,最多是虛擬碼……
首先你需要一個能夠找到在給定區域內所有完全平方數的函式,不妨稱之為
int* find_squres(int a, int b) {…}
沒錯,它返回一個數組的指標指向a到b之間第一個也是最小一個完全平均數,長度為找到的完全平方數如果沒有,可以返回空指標。如果在函式外不能立即知道該陣列長度,你可以把第一位也就是第0位用來記錄找到的完全平方數個數,如果找不到就返回一個長度為1的陣列,這個位置存個0。
這個函式可能對於a b相距較遠的情況會很費時,所以有必要在本地維護一個檔案用以儲存找到的完全平方數。這個檔案規範如下,記錄從1開始,一直到一個大整數N,所有記錄的數全部是順序的完全平均數,不要漏!
我們寫一個叫做
square_decompose(int M)
的函式用來完成指定任務,演算法從這裡正式開始!
在square_decompose中,開啟那個檔案,把檔案中所有的完全平方數用一個數組X存下來
1. 對於每一個輸入的整數M,比較X中最大的N。
2. 如果N小,則呼叫 find_squares( N , M ),將找到的結果全部append到X裡去。
3. 在X裡從最大值往下尋找第一個比M小的整數,N_1,記錄 M_1 = M-N_1,並把N_1記錄下來(記錄方法太多了,比如記錄在檔案裡,列印在終端,或者和其他返回值一起合併成一個數組返回)
4. 若M_1大於零,遞迴呼叫 square_decompose(M_1);若等於零,把X存入檔案,不要append,並退出。
這樣做是非常快的演算法了……速度提升的訣竅在於維護了一張完全平方數表,如果可以提升尋找完全平方數演算法的話,還能更快!