[java]买不到的糖果(买不到的数)
题目: 标题:买不到的数目
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
不需要考虑无解的情况
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7
资源约定:
峰值内存消耗 < 64M
CPU消耗 < 3000ms
import java.util.Scanner;
public class cannotbuy {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a=scanner.nextInt();//输入两数
int b=scanner.nextInt();
for(int i=a*b-1;i>0;i--) {//两数组合,出现的不可能被组合的数一定在a*b内,又a*b一定能被组合故从a*b-1起算
int temp = i;//用temp保存循环中的数
if(temp%a==0||temp%b==0)//若数字能整除两基数则可买到
continue;//能买到则跳过进而测试下一个数
int k=0;//设置标记令k=0;
while(temp>=a) {//必须保证temp大于等于a或b,因为小于两数的数无意义
if(temp%a==0) {//用于判断temp-b后余b是否能被整除a
k=1;//若能整除a说明此数可买
break;//跳出判断
}
temp=temp-b;
}
if(k==0) {
System.out.println(i);//因为前面的循环是从最大数开始,故只需输出第一个不可组合的数即是最大不可买数
break;}//不要漏掉break,因为只需输出一个数
}
}
主要思想:
1. 要求出最大不可买数首先要从最大的数开始遍历,
最大的数应该是两数乘积,最大不可买数一定出
现在两数乘积内,又因为两数乘积一定是可买(
可组合)数。本题是找最大不可买数,故应从
a*b-1开始循环递减。
2. 其次本题的主要是思是判断一个数是否能被组合。首先我们的思维应该是能被两数整除的一定是可买数,则我们开始进行第一步筛选。若循环数是两数倍数则continue跳过。再设置一个用于标记的变量k。遇到非倍数的循环数时我们设置一个while循环用于判断这个数是否可被组合。其主要思想是让这个数减去其中一个基数b后进入if 判断这个数是否能整除a,若不能整除再接着减b,直至这个数小于a,则说明此数为不可买数,若可整除则设置k为1并跳出循环。最后通过k来输出不可买数,注意不要遗漏break,因为我们要找的是最大不可买数,即找到的第一个不可买数,故找到后立即break停止输出。