题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出
一个正整数,表示最大不能买到的糖数
样例输入
4 7
样例输出
17
解法一
//解法1
#include <bits/stdc++.h>
using namespace std;
bool judge(int i,int x,int y)//判断i这个数是否可以买到
{
while(i>0)
{
if(i%x==0||i%y==0)
return true;
if((i-x)%y==0||(i-y)%x==0)
return true;
i-=x+y;
}
return false;
}
int main()
{
int n,m;
cin>>n>>m;
int ans=0;
int cnt=0;//cnt用来判断可以连续买到的数目
int x=min(n,m);
int y=max(n,m);
for(int i=y;;i++)
{
/**
*若可以连续买到的数目等于n和m中较小的那个数,
*说明以后的所有数都可以取到
*例如4和7,18、19、20、21可以连续取到,
*此时要想继续取得后面的数,
*只需要18+4、19+4、20+4、21+4
*/
if(cnt==x)
break;
if(judge(i,x,y))//i这个数可以买到
{
if(cnt==0)
ans=i-1;
cnt++;
}
else//i这个数不能买到,说明连续买的的数出现了中断,从0开始计数
cnt=0;
}
cout<<ans<<endl;
return 0;
}
解法二
//解法2
#include <bits/stdc++.h>
#define N 500000//这里定义N一定要大,若N太小当m,n大时有部分结果无法得到
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
int ok[N];
ok[n]=1;//1表示n这个数可以得到,0表示无法得到
ok[m]=1;
int i=max(n,m);
int ans=0;
for(;i<N;i++)
{
if(ok[i-n]==1||ok[i-m]==1)
ok[i]=1;
else
ans=i;
}
cout<<ans<<endl;
return 0;
}