思路:根据题意可以看出答案一定大于两数中最大的那个,小于两数乘积。又因为要找到最大的那个“最大不能买到的数”,所以直接从乘积开始,从大到小遍历,即区间(max(a,b),a*b),可以节约一部分时间。我才用较笨的方法,使用了三层for循环,大大加大了时间复杂度,又定义了两个数组,增加了空间复杂度,效率较低,目前想不出来更好的方法。

 

代码:

#include<iostream>

using namespace std;

int main(){

    int a,b,max;

    int  num=0,ans;//ans是要输出的变量

    int flag=0;//用来判断是否满足条件,来减少不必要的运行

    cin>>a>>b;

    max=a>b?a:b;//令max为a,b中较大的数字

    int na[max]={0};

    int nb[max]={0};

    for (int i=1;na[i-1]<a*b;i++)

     na[i]=a*i;

for(int i=1;nb[i-1]<a*b;i++)

nb[i]=b*i;

for(int num=a*b;num>max;num--){

for(int i=0;i<max;i++){

for(int j=0;j<max;j++) {

     if(na[j]+nb[i] == num){

      flag=0;

break;

}else flag=1;

}if(flag==0)break;

}

if(flag){

ans=num;

break;

}

}

if(ans==0)return -1;

cout<<ans;

    return 0;

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论