思路:根据题意可以看出答案一定大于两数中最大的那个,小于两数乘积。又因为要找到最大的那个“最大不能买到的数”,所以直接从乘积开始,从大到小遍历,即区间(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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复