解题思路:
    本题首先需要观察数字特点,要找寻最大的不能组成的数,那只需要这样,以4和7举例,从小到大检验每一个数,4,7,8,11,12,14,15,16,18,19,20,21...,然后你会发现之后的就都可以取到了,为什么呢?因为22=4+18,23=4+19,24=4+20...,所以可以发现,只要找到4个连续的可以取到的数,那么就可以取到之后的所有数了,所以之前保存的那一个不能表示的数就是最大的了。
注意事项:
    1. 唯一需要注意的就是编写函数验证num是否可以由a和b组成,在这里可以分为三种情况,num是a的倍数,num是b的倍数,num由a和b组成,若是由a和b组成,那么一定可以写为num=a*m+b*n的形式,就可以按我下述的方法验证了。
参考代码:

#include <iostream>
using namespace std;

bool checkNum(int num, int a, int b) {
	if (num%b == 0 || num%a == 0) {
		return true;
	}
	while (num >= a) {
		if (num%a == 0) {
			return true;
		}
		num -= b;
	}
	return false;
}

void Swap(int* a, int* b) {
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main() {

	int a, b;
	cin >> a >> b;
	if (a > b) {
		Swap(&a, &b);
	}

	int res = a + 1;
	int i = res;
	int count = 0;
	while (1) {
		if (count >= a) {
			break;
		}
		if (checkNum(i, a, b)) {
			count++;
		}
		else {
			count = 0;
			res = i;
		}
		i++;
	}

	cout << res << endl;
	
	return 0;
}


点赞(5)
 

0.0分

3 人评分

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

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

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

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

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

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

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

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

评论列表 共有 5 条评论

杨鹏伟 4年前 回复TA
#include<bits/stdc++.h>

using namespace std;

int main(){
	int n,m;
	cin>>n>>m;
	int res = (n*m) / __gcd(n,m);
	cout<<res - (n+m)<<endl;
	return 0;
}

A了
仲主陆昴 6年前 回复TA
@fangqiao 老哥,举例那个4是两个数里最小的数,你这个例子得把那个4改成10。别只会看答案行不行。
fangqiao 6年前 回复TA
10 11时 答案就不对 30 31 32 33 能连续取到 但29不是结果
Anngo 6年前 回复TA
@Anngo 我又提交了一次提示成功了
Anngo 6年前 回复TA
数量大的时候会超时