标题:买不到的数目
小明开了一家糖果店。他别出心裁:把水果糖包成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一一对应