在上面這個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...