买不到的数目(C语言)

题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成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;           
 }
 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;
}
发布了36 篇原创文章 · 获赞 5 · 访问量 980

猜你喜欢

转载自blog.csdn.net/matchless_QYW/article/details/104730240