标题:买不到的数目
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
不需要考虑无解的情况
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7
资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
解析:
(1)此题目,如果两个数是有公约数的,那么此题无解,但题目提示“不需要考虑无解的情况”,所以我们不需要
考虑此情况,只需要考虑两个数字互为质数的情况。
(2)如果两个输入数字为a,b;则a*b及之后的数字一定是可以组合出来的,例如输入4和7,则28及之后的数字一定是可以组合出来的。
方案一:
此方案利用数学公式:
Scanner input = new Scanner(System.in);
int a = input.nextInt(); //第一种包装有a颗糖
int b = input.nextInt(); //第二种包装有b颗糖
System.out.println(a*b-a-b);
方案二:
将a*b的结果作为上限最大值,然后依次减一循环,逐个判断每个数字是否可以组合出结果,遇到的第一个不能组合出结果的数字即是答案。
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int a = input.nextInt(); //第一种包装有a颗糖
int b = input.nextInt(); //第二种包装有b颗糖
int max = a*b; //当需要买糖的数量>=a*b的时候是一定可以组合出来的,所以max是上限
for (int i = max; i >= 1; i--)
{
if(BuyCandy(a,b,i) == false)
{
System.out.println(i);
break;
}
}
}
//a,b代表两种包装糖果数量count代表买糖果的数量
public static boolean BuyCandy(int a,int b,int count)
{
boolean r = false; //假设不能通过组合的方式买到固定数量的糖果
for (int i = 0; i*a<=count; i++) //循环第一种包装的糖果组合几袋
{
for (int j = 0; i*a+j*b<=count; j++) //循环第二种包装的糖果组合几袋
{
if(i*a+j*b == count)
{
r = true;
}
}
}
return r;
}
此种方案,在每种假设情况下,都进行了组合计算,即BuyCandy函数里面的循环代码。
方案三:
(1)先将所有可能的组合条件下的总糖果数量使用集合进行记录。
(2)然后从a*b为起点,依次减一循环,判断第一个在集合种找不到的元素则为答案。
此方案相对方案二,BuyCandy函数的循环代码只需要执行一次。
Scanner input = new Scanner(System.in);
int a = input.nextInt(); //第一种包装有a颗糖
int b = input.nextInt(); //第二种包装有b颗糖
int max = a*b; //当需要买糖的数量>=a*b的时候是一定可以组合出来的,所以max是上限
Set<Integer> set = new HashSet<Integer>();
//将所有能够组合出来的数量存储到集合中
for (int i = 0; i*a<=max; i++) //循环第一种包装的糖果组合几袋
{
for (int j = 0; i*a+j*b<=max; j++) //循环第二种包装的糖果组合几袋
{
set.add(i*a+j*b);
}
}
//倒序循环判断如果有数字不在上述集合中,则为答案
for (int i = max; i >= 0; i--)
{
if(!set.contains(i))
{
System.out.println(i);
break;
}
}