第四届蓝桥杯 软件类省赛真题 第九题:买不到的数目
2016-03-04 19:40
274 查看
标题:买不到的数目
小明开了一家糖果店。他别出心裁:把水果糖包成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
代码实现:
注意:
1.无限循环中最好不要包含无限循环,易出错
2.要退出n个for,用re和break的配合
3.re还可以作为正确执行的标志
4.适时清0可以处理连续正确的问题
5.de和count要注意,de是从1开始的,并非和count一一对应
小明开了一家糖果店。他别出心裁:把水果糖包成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一一对应
相关文章推荐
- Android学习笔记day12
- webview清理缓存
- codevs 1183 泥泞的道路 01分数规划
- 连通分量模板:tarjan: 求割点 && 桥 && 缩点 && 强连通分量 && 双连通分量 && LCA(近期公共祖先)
- poj 1930 Dead Fraction 混循环小数化分数 数论
- Android之Lollipop DevicePolicyManager学习(上)
- Java之求逆矩阵
- Sql语句学习
- 升级到Android Studio ,出现Toolbar无法使用的情况.
- Netbeans使用maven下载源码
- Day_6作业_模拟人生
- python:学习的动力
- 【GDKOI2016】染色大战 Code&Details
- ps 前端常用技巧
- hdoj 2051 Bitset【10进制转2进制】
- HDU Moving Tables
- 文本挖掘之聚类算法之CLARA聚类算法
- Mysql 基础
- hdu 4586 概率dp
- Fibonacci Numbers on Tree