Johnson


私信TA

用户名:myJohnson

访问量:5186

签 名:

等  级
排  名 14291
经  验 887
参赛次数 0
文章发表 5
年  龄 0
在职情况 学生
学  校 北京科技大学
专  业

  自我简介:

解题思路:
    本题首先需要观察数字特点,要找寻最大的不能组成的数,那只需要这样,以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;
}


 

0.0分

4 人评分

  评论区

#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了
2020-02-04 20:56:02
10 11时 答案就不对 30 31 32 33 能连续取到 但29不是结果
2018-12-17 21:03:24
数量大的时候会超时
2018-11-17 11:20:59
  • «
  • 1
  • »