codeup23204 亲密数对
时空限制 1000ms/128MB
题目描述
两个数A、B,若A的真因子之和等于B,B的真因子之和等于A,则称A和B为亲密数对。现给出m,n区间范围,请找出该区间内的所有亲密数对。如果区间内找不到亲密数对,则输出“No”
如:220 284
220的因子为:1,2,4,5,……220,除去220不算,加起来的和为284。
284的因子为:1,2,4,……284,除去284不算,加起来和220。那么他们就是亲密数对。
输入
一行:整数m,n (0<m<n<10000)
输出
若干行,每一行为一组亲密数对。交换位置算一个重复数对,只输出一个。
样例输入
1 1000
样例输出
220 284
代码
法一:常规版本
#include<iostream>
#include<cmath>
using namespace std;
int main(){
int n,m,a,b,c,i,t;
cin>>m>>n;
for (a=m; a<=n; ++a){
b = 1;
for (i=2,t=sqrt(a); i<=t; ++i)
if (a%i==0) b+=i+a/i;
if (t*t==a) b-=t;
c = 1;
for (i=2,t=sqrt(b); i<=t; ++i)
if (b%i==0) c+=i+b/i;
if (t*t==b) c-=t;
if (c==a && a<b && b<=n) cout<<a<<" "<<b<<endl;
}
return 0;
}
法二:函数版本
#include<iostream>
#include<cmath>
using namespace std;
int find(int x){
int sum=1,t=sqrt(x);
for (int i=2; i<=t; ++i)
if (x%i==0) sum+=i+x/i;
if (t*t==x) sum-=t;
return sum;
}
int main(){
int m,n;
cin>>m>>n;
for (int a=m,b,c,t; a<=n; ++a){
b = find(a);
c = find(b);
if (a==c && a<b && b<=n) cout<<a<<" "<<b<<endl;
}
return 0;
}