找数

来源:互联网 发布:最全家庭网络个人投资 编辑:程序博客网 时间:2024/04/30 20:19
找数(期末考试第一题)
时间限制 : 10000 MS   空间限制 : 65536 KB 
问题描述
给你一个正整数Z,请你找两个正整数X和Y,使得X+Y=Z,且X和Y的最小公倍数尽可能大。输出X和Y的最小公倍数。
输入格式
第一行,一个整数Z
输出格式
一行,一个整数,表示X和Y的最小公倍数。


提示
对于30%的数据 2<=Z<=10^3
对于60%的数据 2<=Z<=10^5
对于100%的数据 2<=Z<=10^9
样例1说明:X=1,Y=3
样例2说明:X=3,Y=7
样例3说明:X=11,Y=12
考试时写的代码:
#include <iostream> 
#include <cstdio> 
#include <cmath> 
using namespace std; 
long long X,Y,Z,ans=0; 
int gongbei(long long x,long long y){ //当时认为第一题很简单便直接使用了暴力枚举,结果超时了。
    long long t,k=x,p=y; 
    while(y!=0){ 
        t=x%y;x=y;y=t; 
    } 
    return k*p/x; 

int main(){ 
    freopen("find.in","r",stdin); 
    freopen("find.out","w",stdout); 
    cin>>Z; 
    long long a,b,c; 
    for(int i=1;i<=Z/2;i++){ 
        a=i;b=Z-i; 
        c=gongbei(a,b); 
        if(c>ans)ans=c; 
    } 
    cout<<c; 
}
考试后重写的代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
long long Z,A,B,ans;
int main(){
    //freopen("find.in","r",stdin);
    //freopen("find.out","w",stdout);
scanf("%lld",&Z);
if(Z%2)ans=(Z/2)*(Z/2+1);//因为相邻的两个奇数一定是互质的,所以只需找出两个相加等于Z的相邻奇数即可。
else
{
   A=Z/2;
   if(A%2)ans=(A+2)*(A-2);
   else ans=(A-1)*(A+1);
}
printf("%lld",ans);
return 0;

}

反思:切忌不加思考地用套路来解题,应该选择更优雅更巧妙的方式解题。

0 0
原创粉丝点击