1.
親和數問題:
求500萬以內的所有親和數
如果兩個數a和b,a的所有真因數之和等於b,b的所有真因數之和等於a,則稱a,b是一對親和數。
例如220和284,1184和1210,2620和2924。
思路:220=1+2+4+71+142=sum[284],
284=1+2+4+5+10+11+20+22+44+55+110=sum[220]。
得284的真因子之和sum[284]=220,且220的真因子之和sum[220]=284,即有sum[220]=sum[sum[284]]=284。
求解步驟如下:
因為所有數的真因數都包含1,所以,先在各個數的下方全部置1
然後取i=2,3,4,5(i<=10/2),j依次對應的位置為j=(4、6、8、10),(6、9),(8),(10)各數所對應的位置。
依據j所找到的位置,在j所指的各個數的下面加上各個真因子i(i=2、3、4、5)。
整個過程,即如下圖所示(如sum[6]=1+2+3=6,sum[10]=1+2+5=8.):
1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 1
2 2 2 2
3 3 45
然後一次遍歷i從220開始到5000000,i每遍歷乙個數後,
將i對應的數下面的各個真因子加起來得到乙個和sum[i],如果這個和sum[i]==某個i』,且sum[i『]=i,
那麼這兩個數i和i』,即為一對親和數。
i=2;sum[4]+=2,sum[6]+=2,sum[8]+=2,sum[10]+=2,sum[12]+=2...
i=3,sum[6]+=3,sum[9]+=3...
......
i=220時,sum[220]=284,i=284時,sum[284]=220;即sum[220]=sum[sum[284]]=284,
得出220與284是一對親和數。所以,最終輸出220、284,...
int sum[5000010]; //為防越界
int main()
}for (i = 220; i <= 5000000; i++) //掃瞄,o(n)。
}return 0;
}
面試演算法題
前幾天,一好友去筆試,有一題 現在有1000個蘋果,和10個箱子,如何把這1000個蘋果裝在這10個箱子裡,才能使不管任何數量 1 1000 的蘋果,都能一次給出?當時,我們都想,出題這人。今天,在想移位的時候,突然想到了,這絕對是二進位制數的變種。分析 1000個蘋果,最接近1024,轉化為2進製...
面試演算法題目
看到一篇部落格,總結了各種鍊錶相關的問題,mark一下,感覺很不錯 戳我 程式設計之美 中 金剛坐飛機 問題 程式設計之美 中 瓷磚覆蓋地板 問題的擴充套件問題 程式設計之美 2.3 尋找發帖水王的擴充套件題目 尋找發帖量最多的三個id,他們發帖總數超過了帖子總數目n的1 4。參考 程式設計之美 2...
面試演算法 排序
0.演算法時間複雜度 演算法的時間複雜度和空間複雜度 總結 1.快速排序 白話經典演算法系列之六 快速排序 快速搞定 快速排序最好,最壞,平均複雜度分析 2.歸併排序 白話經典演算法系列之五 歸併排序的實現 blog.csdn.net morewindows article details 6678...