直接上代码吧,看似容易,却也有要注意的地方啊,还是要练习才行
1 //500万亲合数问题,亲和数就是真因子只和A[A[m]]=m,真因子是不包括他本身的 2 //方法,采用的很巧妙,通过因子找2,3,4,5,6.....,往里放数的方法 3 #include <iostream> 4 #include <cstring> 5 using namespace std; 6 7 #define maxnum 5000000 8 9 void qinheshu(int n) 10 { 11 int *A=new int[n+1]; //从1到5000000,用内存20M 12 //memset(A,1,sizeof(A)*(n+1)); //竟然是这样的,memset是按字节处理的,设置完之后就是每个字节是0x01,int 4字节,就导致一个int变为0x01010101 就是16843009,所以用memset要小心,设置为0就没问题,因为所有字节为0,其它就要注意了,多数都不行。 13 for(int i=0;i<=n;i++) 14 A[i]=1; 15 for(int i=2;i<=n/2;i++) 16 { 17 int j=2*i; 18 while(j<=n) 19 { 20 A[j]+=i; 21 j=j+i; 22 } 23 } 24 for(int i=1;i<=n;i++) 25 { 26 if(A[i]<=n&&A[i]>i&&A[A[i]]==i) //注意必须是A[i]>i才能去重,否则如i=6,A[i]==6,A[A[6]]==6,即存在A[i]==i的情况,必须提出,同时注意i>=0,否则越界 27 cout<<i<<" "<<A[i]<<endl; 28 } 29 delete A; 30 } 31 int main() 32 { 33 qinheshu(maxnum); 34 system("pause"); 35 }