题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
思路分析
由题目已知,设两包数目分别为4、7,那么我们分析得到能凑出来数目为4,7,8,11,12,14,15 ,16,18,19,20,21,22,23,24,25……,其中18=11+7,19=12+7,20=16+4,21=14+7,22=18+4,23=19+4……,所以得到的17后面的数都能凑出来,17为凑不出来的最大数目。
我们设置一个条件,即最小公倍数以上的数肯定能凑出来,a,b为输入的每袋中的数目,设c是1到最大公倍数的其中一个数,那么就有方程ax+by=c,所以(c-ax)%b=0(即y为整数)时代表能凑出来,当(c-xa)%b不等于0时,说明这个数就是第一个不能凑出来的最大的数。
代码实现
#include<stdio.h>
int gys(int a,int b) //求最大公约数
{
if(b==0)
return a;
else
return gys(b,a%b);
}
int judge(int a,int b,int c)
{
while(c>0)
{
if(c%a==0 || c%b==0)
return 0; //能凑出来,返回0
c=c-a; //方程(c-a*x)%b
}
return 1;
}
int main()
{
int a,b,c,i;
scanf("%d%d",&a,&b);
c=a*b/gys(a,b);
for(i=c-1;i>0;i--) //最小公倍数是肯定能凑出来的,从最小公倍数-1开始,枚举
{
if(judge(a,b,i)) //判断是否能凑出来
{
printf("%d\n",i);
break;
}
}
return 0;
}