买不到的数目
问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)输出格式
一个正整数,表示最大不能买到的糖数样例输入1
4 7
样例输出1
17
样例输入2
5 3
样例输出2
7
题目解析
由题意得出结论:因为一定有解,所以输入的两个数一定是互质的
a * x +b * y = C,x y 互质,方程有解且都是整数的C的上界最大是 x * y;
方法一:0和100分的差距
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int a, b;
cin >> a >> b;
cout << a * b - a - b << endl;
return 0;
}
方法二:枚举
把所有两个数的组合方式枚举出来,存储到集合里面,最后反向输出没有出现的数,即为最大的不能组合的数 !
#include <iostream>
#include <set>
using namespace std;
int main(int argc, char** argv) {
int a, b;
cin >> a >> b;
set<int> ss;
for(int x = 0; a*x <= a*b; x++){
for(int y = 0; a*x + b*y <= a*b; y++){
ss.insert(ss.end(), a*x+b*y);
}
}
for(int i = a*b; i >= 0; i--) {
if(ss.find(i) == ss.end()){ //i 不在set,即为答案
cout << i << endl;
break;
}
}
return 0;
}