亲和数问题

转载自:http://blog.csdn.net/v_JULY_v/article/details/6441279

问题描述:

求500万以内的所有亲和数
如果两个数a和b,a的所有真因数之和等于b,b的所有真因数之和等于a,则称a,b是一对亲和数。
例如220和284,1184和1210,2620和2924。

求解思路:使用的伴随数组,只不过,因为题目的特殊性,只是它方便和巧妙地利用了下标作为伴随数组,来节约时间。同时,将回溯的思想换成递推的思想(预处理数组的时间复杂度为logN(调和级数)*N,扫描数组的时间复杂度为线性O(N)。所以,总的时间复杂度为O(N*logN+N)(其中logN为调和级数)  )。

代码:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 #define size 5000002
 6 int sum[size];
 7 
 8 int main()
 9 {
10     for(int i = 1; i <= size; i++)
11         sum[i] = 1;
12     for(int i = 2; 2*i < size; i++)
13     {
14         int j = i+i;
15         while(j < size)
16         {
17             sum[j] += i;
18             j += i;
19         }
20     }
21 
22     for(int i = 1; i <= size; i++)
23     {
24         if(sum[i] > i && sum[i] < size && sum[sum[i]] == i)
25         {
26             cout << i << "\t" << sum[i] << endl;
27         }
28     }
29     return 0;
30 }
View Code

 

posted @ 2013-12-20 20:36  ggbailei  阅读(288)  评论(0)    收藏  举报