题目要求:如果两个不同的正整数,他们的和是他们积的因子,则称这两个数为兄弟数,小的成为弟数,大的称为兄数,先后输入正整数n和m,你(n<m),请在n—m这m-n+1个数中,找出一对兄弟数,如果找不到,就输出“no solution”,如果能找到,就找出和最小的那一对;如果有多对兄弟数和相同且都是最小,就找出弟数最小的那一对
一、我给出的答案是这样的,思路是先用两重for循环取数,取出数字来判断是否是兄弟数,第一次取得的兄弟数,直接记录其和为最小值,第二次以后的,与前一次和进行比较,如果小,重新记录此时的兄弟数,如果相等,则比较取出的兄弟数中的弟数是不是比前一次的小,如果小,就记录本次的兄弟数。当中使用了time变量进行第一次还是第二次以后的判断。最后根据兄弟数的个数进行输出。
int main()
{
scanf("%d,%d",&n,&m);
for(int i=n;i<m;++i)
{
for(int j=i+1;j<=m;++j)
{
if((i*j)%(i+j)==0)//判断是否是兄弟数
{
SUM=i+j;
if(time==1)
{
SUMmin=SUM;
final_i=i;
final_j=j;
}
else
{
if(SUM<SUMmin)
{
SUMmin=SUM;
final_i=i;
final_j=j;
}
else if(SUM=SUMmin)
{
if(i<final_i)
{
final_i=i;
final_j=j;
}
}
}
++time;
}
}
}
if(time>=1)
{
printf("%d,%d",final_i,final_j);
}
else
{
printf("No Solution.");
}
return 0;
}
二、老师给出的答案更加简洁,其中两次使用了break跳出循环,避免了后边重复执行循环操作,这也是break的精妙之处
以上部分代码,其中第一次跳出循环,是判断 i 比之前取出的兄弟数a,b的值的一半还要大,如果出现这种情况,因为 j 比 i 还要大,所以 i+j的值肯定要大于前边取出的兄弟数的和,所以如果取出这样的 i 和 j 的值,当直接放弃,跳出取 i 的循环; 第二次跳出循环,是在 i 和 j 均被取出来之后,直接判断i+j的值是否大于之前确认的兄弟数 a+b的和,如果大,根据题干要求没有意义,再次取j的话更大,更不符合要求,因此直接跳出取 j 的循环,重新寻找 i 和 j ,看是否有合适的值
老师给出的答案,通过巧妙的两次跳出循环,是整段代码更加简洁,执行效率更高,值得学习记录。