筛法求亲和数对

【输入格式】
一个整数
【输出格式】
输出所有小于的亲和数对的和
 
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 }

 

posted @ 2020-11-08 20:19  code1288  阅读(149)  评论(0)    收藏  举报