//将一个N位数猜分为N个数字
cout<<"请输入一个多位数:"<<endl;
int n;
cin>>n;
int *p=new int[10];
while(n!=0){
p[k]=n%10;
k++;
n=n/10;
}
for(i=k-1;i>=0;i--){
cout<<" "<<p[i];
}
delete[] p;
cout<<endl;
/***********亲密数对********************/
int main()
{
int i,j,k=0;
int a,b,temp,tem;
/*
//算法一:这个算法最容易想到,但是时间复杂度相对较大,不仅要计算a的全部因子,还要计算b的全部因子,而且b每变一次,a也要重新计算其因子之和
for(a=11;a<=32000;a++)
{
for(b=10;b<a;b++)
{
temp=0;tem=0;
for(i=1;i<=a/2;i++)
if(a%i==0)temp+=i;//求a的全部因子之和temp
for(j=1;j<=b/2;j++)
if(b%j==0)tem+=j;//求b的全部因子之和tem
if((temp==b)&&(tem==a))//亲密数对三个条件
{
k++;
cout<<b<<","<<a<<'\t';
if(k%3==0)cout<<endl;
}
}
}cout<<endl;
*/
//算法二:这个算法最主要的思想是默认b就为a的因子之和,满足其一个条件先,再来进行下一步比较,算法时间复杂度小了很多。
for(a=11;a<=320000;a++)
{
temp=0;tem=0;
for(i=1;i<=a/2;i++)
if(a%i==0)temp+=i;//求a的全部因子之和temp
b=temp;//我们假定满足第一个条件的情况下,求出b的因子之和,再和a比较,若成功则为亲密数对
if(a<b){ //再限定满足第二个条件的情况下计算b的因子之和,从而减少运算时间
for(j=1;j<=b/2;j++)
if(b%j==0)tem+=j;//求b的全部因子之和tem
if(tem==a)//亲密数对三个条件
{
k++;
cout<<a<<","<<b<<'\t';
if(k%3==0)cout<<endl;
}
}
}cout<<endl;
return 0;
}