目录
问题描述:
解题思路:
代码实现:
优化前代码:遍历所有可能的情况,未对不满足题设要求的数据进行筛选
#include <iostream>
using namespace std;
int main(){
/* 最佳兄弟数求解 */
int n,m; //记录输入的两个数
int a,b; //记录当前的兄弟数,并初始化为一个不可能为兄弟数的值(最终判断是否存在兄弟数)
cin>>n>>m;
a=m+1;
b=m+1;
//枚举出来所有可能的弟数,先确定一个弟数 ,最大取值为m-2;
for(int i=n;i<m-1;++i)
{
//遍历出所有可能的兄数,比i大,比m小,最大取值为m-1
for(int j=i+1;j<m;++j)
{
//判断是否满足兄弟数的条件
if((i*j)%(i+j)==0)
{
//满足兄弟数的条件
//更新a,b的值
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 solutionl";
}
else
{
cout<<a<<" "<<b;
}
return 0;
}
优化后代码:对数据进行筛选,去除不可能的数据,减少计算量
1.当 i(弟数) 的取值大于等于(a+b)/2 的时候,此时两个兄弟数的和一定大于 a+b ,按理来说,
兄弟数的和应当小于 m+m 的值,所以当弟数 i 大于等于(a+b)/2 时,此后所有的数据都不符合
要求,应当使用 break 语句退出循环;
2.当在遍历 j(兄数) 时,若 i+j 大于 a+b ,此时 a,b 的值不会更新,此时也可以使用 break 语句停
止 j 的自加,减少数据的计算;
#include <iostream>
using namespace std;
int main(){
/* 最佳兄弟数求解 */
int n,m; //记录输入的两个数
int a,b; //记录当前的兄弟数,并初始化为一个不可能为兄弟数的值(最终判断是否存在兄弟数)
cin>>n>>m;
a=m+1;
b=m+1;
//枚举出来所有可能的弟数,先确定一个弟数 ,最大取值为m-2;
for(int i=n;i<m-1;++i)
{
//1.优化
if(i>((a+b)/2+1))
{
//退出该层循环
break;
}
//遍历出所有可能的兄数,比i大,比m小,最大取值为m-1
for(int j=i+1;j<m;++j)
{
//2.优化
if((i+j)>(a+b))
{
//退出此轮循环
break;
}
//判断是否满足兄弟数的条件
if((i*j)%(i+j)==0)
{
//满足兄弟数的条件
//更新a,b的值
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 solutionl";
}
else
{
cout<<a<<" "<<b;
}
return 0;
}
以上便是算法专栏的第一个小问题,感谢大家的浏览!
蓝桥杯学习第一天!继续坚持