親和數問題求解

2021-06-18 02:48:13 字數 1339 閱讀 5596

在上面這個blog中看到不少比較經典的演算法問題研究,俗話說,好記性不如爛筆頭,所以記錄一下自己的理解,以防忘記

1首先,什麼是是親和數?

親和數成對出現,假如a和b是一對親和數,那麼a的所有的真因子之和等於b,反過來b的所有真因子之和等於a

舉個栗子:

220和284,一對最小的親和數

220的真因子:1,2,4,5,10,20,22,44,55,110所有之和等於280

284的真因子:1,2,4,71,142,所有之和等於220

2對於求500萬以內的親和數

july的部落格中利用乙個伴隨陣列的思想,即,建立乙個陣列arr[5000000],陣列的值為陣列下表的所有真因子之和,

也就是說arr[220]=284,然後判斷對於第i個數,是否滿足arr[arr[i]]=i,若滿足則為親和數。

這裡對於我當

時理解的關鍵,就是怎麼求乙個數的所有真因子之和,對於單個數n,只能是遍歷n/2來求

對於5000000個數,上述blog利用如下過程求解

for (i = 0; i <= 5000000; i++)   

sum[i] = 1; //1是所有數的真因數所以全部置1

for (i = 2; i + i <= 5000000; i++) //預處理,預處理是logn(調和級數)*n。

//@litaoye:調和級數1/2 + 1/3 + 1/4......的和近似為ln(n),

//因此o(n *(1/2 + 1/3 + 1/4......)) = o(n * ln(n)) = o(n*log(n))。

}

因為1是所有數的真因子,故先處理。然後,遍歷i從2到2500000,對於是i倍數的所有元素,都將i加到對應的陣列值上

舉個栗子再,求10以內的所有數的真因子之和

因子\數值12

3456

78910

1111

1111

1122

2223

3344

55最近在看python,寫段python的試試

array=[1 for i in range(5000000)]

for i in range(2,2500000):

j=2*i

while(j<5000000):

array[j]+=i

j+=i

for i in range(5000000):

if array[i]>i and array[i]<=5000000 and array[array[i]]==i:

print i,array[i]

問題 親和數

題目描述 古希臘數學家畢達哥拉斯在自然數研究中發現,220 的所有真約數 即不是自身的約數 之和為 1 2 4 5 10 11 20 22 44 55 110 284。而 284 的所有真約數為 1 2 4 71 142,加起來恰好為 220。人們對這樣的數感到很驚奇,並稱之為親和數。一般地講,如果...

ACM「親和數」問題 1157

親和數 問題 題目描述 古希臘數學家畢達哥拉斯在自然數研究中發現,220的所有真約數 即不是自身的約數 之和為 1 2 4 5 10 11 20 22 44 55 110 284。而284的所有真約數為1 2 4 71 142,加起來恰好為220。人們對這樣的數感到很驚奇,並稱之為親和數。一般地講,...

杭電 親和數

親和數 input 輸入資料第一行包含乙個數m,接下有m行,每行乙個例項,包含兩個整數a,b 其中 0 a,b 600000 output 對於每個測試例項,如果a和b是親和數的話輸出yes,否則輸出no。sample input 2 220 284 100 200 sample output ye...