亲和数问题
转载自: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 }

浙公网安备 33010602011771号