C/C++程序设计与算法第四周:求兄弟数

要求:
如果两个不同的正整数,他们的和是他们的积的因子,就被成为兄弟数
小的是弟数,大的是兄数。
先后输入正整数 n 和 m (n < m),请在 n 至 m-n+1 个数中,找出一对
兄弟数。如果找不到就输出 No,找得到就和最小的那个,如果和数相等
就输出弟数最小的那一对
首先看一个想的简单了里的程序,有漏洞

#include<iostream>
using namespace std;
int main(){
    int n,m;
	cout<<"input n,m"<<endl;
	cin>>n>>m;
	int flag = 0;
	if(n < m){
       for(int i = n;i < m;i++){
	       for(int j = i;j <= m;j++){
		      if(i*j % (i+j) == 0){
			     cout<<"弟数"<<i<<"兄数"<<j<<endl;
				// cout<<i+j<< //将结果打印出来,确实会存在(5,20) (6,6) 这种下一个兄弟数和更小的情况
				 flag = 1;
				 break;
              }
		   }
		   if(flag == 1){
		      break;
		   }
	   }
	}

	else
	   cout<<"n,m 不符合大小关系"<<endl;
	return 0;
}


下面是正确的程序设计


#include<iostream>
using namespace std;
int main(){
    int n,m;
	cin >> n >>m;
	if(n < m){
	   int a = m,b = m; // 记录最佳兄弟数
       for(int i = n;i < m;i++){
	      if(i > (a+b)/2 + 1)  // 超过上一轮的最佳兄弟数大小就不需要进行循环了
		     break;
		  for(int j = i;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)
	     cout<< a <<" "<< b<<endl;
	   else
	     cout<<"No"<<endl;
	}
	else
	   cout<<"n,m 不符合大小关系"<<endl;
	
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值