第四届蓝桥杯 软件类省赛真题 第九题:买不到的数目

标题:买不到的数目


    小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。


    小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。


    你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。


    本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。


输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)


要求输出:
一个正整数,表示最大不能买到的糖数


不需要考虑无解的情况


例如:
用户输入:
4 7
程序应该输出:
17


再例如:
用户输入:
3 5
程序应该输出:
7






 
资源约定:
峰值内存消耗(含虚拟机) < 64M
CPU消耗  < 3000ms




请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。


所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.6及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
================================================================
思路:
4和7最大不能组成的是17
 包装中糖的颗数(都不多于1000)
 
1.获取包装的两个数:a,b
2.用for穷举得数de
3.用双for列出n m包数,如果 a*n+b*m==de,就a=1;不同sum=0;
4.用sum+=a来统计,如果sum>100,输出de-99就是最大数


上课的时候突然想到了解法:
1.穷举:首先无限穷举得数
2.穷举:然后穷举倍数nm,到得数为止(最小的1都算进去)
3.筛选:倍数有无:
如果n*a+m*b==de,count++,跳出两层for,继续下一个数
不等于的话,continue,继续穷举倍数
穷举到尽头,count=0

代码实现:
package com.aiqiongdiao;
import java.util.Scanner;


public class Main {
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int a=input.nextInt();
		int b=input.nextInt();
		int de=1,count=0,re=0;
		for(de=1;;de++){
			re=0;   //重新赋值re
			for(int n=0;n<de;n++){    //循环倍数
				for(int m=0;m<de;m++){
					if(n*a+m*b==de){   
						count++;   //计数加1
						re=1;   //已有倍数的标志
						break;   //跳出第一层倍数循环
					}		
				}
				if(re==1){break;}	//已有倍数了,给我跳出第二层倍数循环
			}
			if(re==0){count=0;}//执行完倍数之后还是找不到,count清0:表示重新修过			
			else{
				if(count==a){    //连续a个有倍数就够了,可以继续提供糖果
					System.out.println(de-a);   //count比de少一个,要获取第一个数,只要减去count就可以
					return;   //记得关掉程序
				}
			}
		}
	}
}







注意:
1.无限循环中最好不要包含无限循环,易出错
2.要退出n个for,用re和break的配合
3.re还可以作为正确执行的标志
4.适时清0可以处理连续正确的问题
5.de和count要注意,de是从1开始的,并非和count一一对应






























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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值