题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成 4 颗一包和 7 颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是 17。大于 17 的任何数字都可以用 4 和 7 组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入描述
输入两个正整数,表示每种包装中糖的颗数(都不多于 1000 )。
输出描述
输出一个正整数,表示最大不能买到的糖数。
不需要考虑无解的情况
输入输出样例
示例
输入
4 7
输出
17
运行限制
最大运行时间:3s
最大运行内存: 64M
解题思路:
①原文链接:https://blog.csdn.net/a1439775520/article/details/97652774
public class Main {
static int a;
static int b;
static int N=1000*100; //定义一个尽量大的结果糖果数
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
//获取a,b糖果颗数!
a=input.nextInt();
b=input.nextInt();
//定义很大的数组
int[] point=new int[N];
//标记数组的方法
pointArray(point);
//输出最大不能得数
if(maxGet(point)){ //一返回true,结束程序
return;
}
}
/**
* 标注能得到结果的角标数组
* @param point
*/
public static void pointArray(int[] point) {
//循环a的数组标记
for (int i = 0; i < N/a; i++) { //x最大不会超过结果/a
for (int j = 0; j < (N-a*i)/b; j++) { //代入最大结果,获得的值不会被超过
point[a*i+b*j]=1; //对能获得的数进行标注
}
}
}
public static boolean maxGet(int[] point) {
//定义计数器
int count=0;
//循环数组,如果内容为1则计数器加1,否则清0,判断计数器,如果count==a,输出 循环脚标-a 的数值,这个数就是最大数
for (int i = 0; i < point.length; i++) {
if(point[i]==1){
count++;
if(count==a){
System.out.println(i-a);
return true;
}
}else{
count=0;
}
}
return false; //防止报错
}
}
②原文链接:https://blog.csdn.net/qq_58688583/article/details/122895649
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class C201309买不到的数目 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
int max = a * b;
Set<Integer> ss = new HashSet<>();
//从0开始枚举到max
for (int x = 0; a * x < max; x++) {
for (int y = 0; a * x + b * y < max; y++) {
ss.add(a * x + b * y);//用不小于0的x和y与系数能组合出来的数加入set中
}
}
for (int i = max - 1; i >= 0; i--) {
if (!ss.contains(i)) {//查找第一个不在set中的值
System.out.println(i);
break;
}
}
}
}
③原文链接:https://blog.csdn.net/qq_43765535/article/details/111305461
定理:
(1)如果p和q的最大公约数 > 1 ,那么一定不存在p和q无法组成的最大的数
(2)如果p和q互质,那么p和q无法组成的最大的数就是 (p−1)∗(q−1)−1
import java.util.*;
import static java.lang.System.out;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
out.println((n - 1) * (m - 1) - 1);
}
}