您的位置:首页 > 其它

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

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

代码实现:

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一一对应
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: