如果两个不同的正整数,他们的和是他们的积的因子,就称这两个数为兄弟数,小的称为弟数,大的称为兄数。先后输入正整数 n 和 m (n < m) ,请在 n 至 m 这 m-n+1 个数中,找出一对兄弟数。如果找不到,就输出“No Solution.”。如果能找到,就找出和最小的那一对;如果有多对兄弟数和相同且都是最小,就找出弟数最小的那一对。
思路:枚举每一对不同的数,看看是不是兄弟数。用两个变量记录当前已经找到的最佳兄弟数,如果发现更佳的,就更新记录。
最佳写法
#include <iostream>
#include <cstdio>
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){//取弟数
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;
}
洛(ruo)基(ji)写法
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n,m;
cin >> n >> m ;
int a=m+1,b=m+1;
for(int i=n;i<=m;++i){
for(int j=i+1;j<=m;j++){
if(i*j%(i+j)==0){
if(a+b>i+j){
a=i;
b=j;
}
else if(a+b==i+j && a>i){ //
a=i;
b=j;
}
}
}
}
if(a==m+1)
cout<<"No solution.";
else
cout<< a<<" "<<b;
return 0;
}
虽然两个代码,都可以得到正确结果,但是,代码执行时间,大约差了一倍,简直“致命”。