筛法求亲和数对
【输入格式】
一个整数M
【输出格式】
输出所有小于M 的亲和数对的和
300<=M<=2000000
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 6 const int NR=2000000; 7 int arr[NR]; 8 //数组中存储下标i的真因数之和 9 int main(){ 10 int i,j; 11 //1是每个数的真因数,因此数组中均加上1 12 for(i = 1;i <= NR;i++) { 13 arr[i] = 1; 14 } 15 16 //i代表因子,从2开始遍历,依次加到符合条件的数组中 17 for(i = 2;i + i <= NR;i++){ 18 j = i + i;//j为数字的下标 19 //依次将因子加到相应的数组值中 20 //数组中存放因子之和 21 while(j <= NR){ 22 arr[j] += i; 23 j += i; 24 } 25 } 26 27 int n; 28 scanf("%d",&n); 29 int sum=0; 30 //遍历亲和数对, 31 for(i = 2;i <= n;i++){ 32 //printf("%d %d\n",i,arr[i]); 33 //a,b两个数不相等 34 //不能重复累加a和b,因此筛选出a<b的数对 35 //b小于n 36 if((arr[i] < i) && (i < n) && (arr[arr[i]] == i)) { 37 //printf("----%d %d\n",i,arr[i]); 38 sum = sum + arr[i] + i; 39 } 40 } 41 printf("%d",sum); 42 return 0; 43 }