蓝桥杯 买不到的数目 java代码

java代码实现

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7
资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗 < 3000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。

思路:这道题目参与一些数学思维,如果局限于寻找一个条件或者中间值来判断,那很难得出答案,
反观题目我们可以推出 ax+by=c的一个这样的等式,在利用for循环遍历所有的可能值,在进行逐一推断。
1、根据题目意思可以得出 ax+by=c (a,b为输入的糖果数量,x,y为未知数,c能买的数量)。
2、在列出所有的 ax+by=c 的可能,在此时我们需要找到一个临界点,那就是 a*b,因为通过全文我们已知的就只有a,b的值。
3、在创建一个集合进行遍历,从大到小输出,第一个不在集合之中的i就是–最大不能买到的数量。

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class 买不到的数目 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根

	Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		int b=sc.nextInt();
		
		//定义一个集合
		Set<Integer> set=new HashSet<Integer>();
		//枚举出小于a*b的所有可能数
		for(int x=0;a*x<=a*b;x++) {          //列出x的可能
			for(int y=0;a*x+b*y<a*b;y++) {        //  列出x的可能+列出y的可能
				set.add(a*x+b*y);             //将a*x+b*y的可能添加的set集合中
			}
		}
		
		//将集合从大到小输入,第一个不在集合之中的i就是--最大不能买到的数量
		for(int i=a*b-1;i>0;i--) {
			if(!set.contains(i)) {
				System.out.print(i+" ");
				break;
			}
		}
		
		
	
		
	}

}

其实这个题目还有另外一种解法,利用 a*b-a-b 所得出的结果就是我们所寻求的答案。如果没想到这种方法用上述的枚举也行。


import java.util.Scanner;
public class 买不到的数目 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
	Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		int b=sc.nextInt();
		
		System.out.print(a*b-a-b);
	}
}
发布了16 篇原创文章 · 获赞 0 · 访问量 131

猜你喜欢

转载自blog.csdn.net/qq_43530597/article/details/105113723