题目描述
如果两个不同的正整数,它们的和是它们的积的因子,就称这两个数为兄弟数,小的称为弟数,大的称为兄数.先后输入正整数n和m(n<m),请在n至m这n-m+1个数中,找出一对兄弟数。如果找不到,就输出”No Solution”.如果能找到,就找出和最小的那一对;如果有多对兄弟数和相同且都是最小的,就找出弟数最小的那一对。
解题思路
此题的思路就是枚举每一对不同的数,看看是不是兄弟数。用两个变量记录当前已经找到的最佳兄弟数,如果发现更佳的,就重新记录。
我的代码
#include<iostream>
using namespace std;
int main()
{
int n,m,i,j,p,q;
cin>>n>>m;
p=q=m;
for(i=n;i<=m;++i)
{
for(j=i+1;j<=m;++j)
{
if(i*j%(i+j)==0)
{
if((i+j)<(p+q))
{
p=i;q=j;
}
break;
}
}
}
if(p==m)
cout<<No Solution
else
cout<<p<<q;
return 0;
}
优秀代码
#include<iostream>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int a=m+1,b=m+1;//a,b用来记录已经找到的最佳兄弟数,a是弟数,b是兄数
for(int i=n;i<m;++i) //取弟数,共m-n种取法
{
if(i>(a+b)/2+1)
break; //跳出外重循环
for(int j=i+1;j<=m;++j)//取兄数
{
if(i+j>a+b)
break; //跳出内重循环
if(i*j%(i+j)==0)//发现兄弟数
{
if(i+j<a+b)//发现和更小的兄弟数
{
a=i;b=j;//更新已找到的最佳兄弟数
}
else if(i+j==a+b&&i<a)//发现和相同但弟数更小的兄弟数
{
a=i;b=j;//更新已找到的最佳兄弟数
}
}
}
}
if(a==m+1) //没找到兄弟数
cout<<"No solution";
else
cout<<a<<","<<b;
return 0;
}