PREV-8买不到的数目(Java)详解

PREV-8买不到的数目(Java)详解

前言

这道题吧,难在数学吧,代码方面还是简单的,好吧,这就是一道数学题.其中的数学原理我也讲不清楚(可能也是还没真正理解到这道题)还是看视频吧,这道题是第四届(2013年)蓝桥杯C++A组第8题,可以在对应蓝桥真题讲解视频中找到.下面是我从中得到的一些理解:这道题即就是解ax+by=c的不定方程式,a,b是系数,即输入的样例,x,y是未知数,c是可以买到的数目,那么买不到的数目就这个方程无解的时候对应的c,在数学上来说,只要a,b这两个数互质,这个方程有解且有无数多个解(我也不知道有这么一个原理),即就是不会出现买不到的数目,但对于这道题来说,x,y是大于等于0的整数,所以会出现一个最大的买不到的数目,超过了这个数的所有的数都是有解的,要有解且有无数多个解成立,就会得到两个隐含的条件:①.a,b是互质的,这个方程有无数个解;②.c是a和b的最大公约数的倍数时,这个方程是有解且有无数个解,而且这两个条件是等价的,为什么是等价的呢,a和b是互质的,那么a,b的最大公约数就是1,任何数都是1的倍数,所以这个方程会是一定有解且有无数个解,题上又说:有一个无解的c是最大的,大于这个c的数都有解,可以得到,如果a,b的最大公约数不为1,即a,b不互质,假如a,b的最大公约数为2,假设c等于3,那么这个方程是无解的,因为c不是a和b的最大公约数的倍数,同理5也不是,7也不是,只要是奇数都是买不到的数目,那么就没有一个是最大的买不到的数目,因为这个买不到的数目将没有上界,会是无穷大,所以a,b一定是互质的.然后这里又将得到一个公理(也是我不知道的)
当a,b互质,x>=0,y>=0,使得方程ax+by=c无解时,c最大为ab-a-b;如果知道这个的话,那么这道题几行代码就写完了,见代码1.
如果不知道,也没关系,我们也可以推出买不到的数目的上界至大是ab,为什么呢,如果x,y可以小于0,那么买不到的数目是不存在的,当x,y大于等于0,存在一个最大的买不到的数,且一旦超过这个最大的买不到的数目后,后面的数都是可以买到了,那么我只需要找一个可以买到的数,且这个数也不算太小,我往下枚举,就一定能找到那个最大的买不到的数目,当c=ab时为ab的最小公倍数时,肯定是有解的啊,即c一定能买到啊,当x=0,y=a或者x=b,y=0时,如果再往上,x,y将不会出现负数解,即都将有解.
由于篇幅原因就直接上代码了.

代码1

import java.util.Scanner;

public class PREV_8{
	public static void main(String args[]){
		Scanner sc=new Scanner(System.in);
		int a=sc.nextInt();
		int b=sc.nextInt();
		System.out.println(a*b-a-b);
	}
}

代码2

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

public class PREV_8 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);	
		Set<Integer> ss = new HashSet<Integer>() ;//定义一个集合
		int a=sc.nextInt();
		int b=sc.nextInt();
		for(int x=0;a*x<=a*b;x++){
			for(int y=0;a*x+b*y<=a*b;y++){
				ss.add(a*x+b*y);//将该组数据放到集合中
			}
		}
		for(int i=a*b;i>0;i--){//枚举
			if(!ss.contains(i)){//如果这个数不在这个集合中,那么这个数就是买不到的数目,且是从最大的数开始枚举,那么很容易就能找到那个最大的买不到的数目
				System.out.println(i);
				break;//找到后就退出不浪费资源
			}
		}
	}
	
}

总结

这两个代码都是能够AC,难点就在数学分析上,如果有读者不太明白这个过程,可结合我从中理解到的和视频内容来理解.个人拙见,如有不正确的地方,还望指正

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值