解题思路:

首先我们要了解,当num能被a和b组合出来时,只有三种情况:

(1)num%a==0

(2)  num%b==0

(3)  num = n*a + m*b  , (n,m = 1,2..........n)

只要弄清这三种原因就好办了,我们可以写一个函数check来判断num是否可以被组合,然后用循环来倒序查找,因为我们知道不能被组合的最大数不可能超过a*b,所以我们可以从a*b开始来递减查找,第一次查出来的就是最大的无法组合数。


注意事项:
当判断第三种条件时,可以让n不断减去一个数b,每减一次就判断n%a是否为零。

import java.util.Scanner;
public class 买不到的数目 {
 
 //判断数n是否可以被a, b组合
 public static boolean Check(int n, int a, int b){
  //当n为a或b的倍数
  if(n%a==0 || n%b==0)
   return true;
  while(n>=a)
   if(n%a==0)
    return true;
   n=n-b; //这一步必须在判断之后,不然核能会出现n<0的情况
  }
  return false;
 }
 public static void test1(){
  Scanner scan = new Scanner(System.in);
  int a = scan.nextInt();
  int b = scan.nextInt();
  if(a>b){
   int temp = a;
   a=b;
   b=temp;
  }
  
  for(int i=a*b; i>0; i--){//倒着查找,第一次查出来的就是最大的无法组合数
   if(!Check(i, a, b)){
    System.out.println(i);
    break;
   }
  }
  
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  test1();
 }
}


点赞(4)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 4 条评论

熊锋云 4年前 回复TA
@Vincent @deacon 多弄几个数据,转换成矩阵看看
日久弥新 5年前 回复TA
@Vincent 对啊,+1,一样搞不懂为啥
橘子爱露露 5年前 回复TA
厉害了
Vincent 5年前 回复TA
是如何知道被组合的最大数不可能超过a*b的? 求解答