面試演算法記錄

2021-06-23 08:19:36 字數 1157 閱讀 1969

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...