[java]买不到的糖果(买不到的数)

该博客介绍了一个编程问题,涉及如何找出使用特定数量的4颗和7颗糖果包装时,最大的无法组合出来的糖果数。作者提供了一个Java程序,通过循环和条件判断来找出这个数,方法包括从最大可能数开始递减,检查每个数是否能被4或7整除,如果不能则输出该数作为最大不可买数。程序的时间和内存消耗都在限制范围内。
摘要由CSDN通过智能技术生成

[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停止输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值