(C言語)の数を購入することはできません

タイトル説明
暁明はお菓子店をオープンしました。彼の創意工夫:パケットにフルーツの砂糖パケットパケットの4と7二種類。キャンディアンパックを販売することはできません。
子供たちは砂糖を購入するとき、彼は2つの梱包を組み合わせるために使用しました。もちろん、お菓子の数のいくつかの組み合わせは、10砂糖を購入するために、例えば、外ではありません。
あなたは17で、最大数を購入することはできません、コンピューターテスト、ケース内のパッケージを使用することができます。17より任意の数の大きい組み合わせて4および7の実施に使用することができます。
タイトルはパッケージの数が知られている2つの間に必要とされ、組み合わせが最大の番号を見つけることができません。
入力形式
各糖包装(以下1000)の歯の数を表す2つの正の整数
の出力フォーマット
購入することができない糖の最大数を表す正の整数
サンプル入力1
4 7
サンプル出力1
。17
サンプル入力2
。3. 5
の出力例2
。7

分析思考
番号4、7の2つのパケットを設定し、既知の対象によって、それぞれ、その後、私たちは分析が4,7,8,11,12,14,15、16,18,19,20,21の番号を掻き出すことができます取得、 22、23 ...、18 = 11 = 12 + 7,19 + 7,20 + 4,21 = 16 = 14 = 18 + 7,22 4,23 = 19 + 4 + ......したがって数17の後ろの最大数は、の世話をしないうちハッシュうち、17を得ることができます。
我々は、上記の数の最小公倍数は確かに、袋の数が入力され、Bは、cは1〜最大公倍数の数は、その後、式Aが存在するで提供される掻き出すことを条件設定X + B = YをCは、そう(CAのこと%のB = 0(すなわち、yは整数である)の代表は、x掻き出すため)を、(CX a)は、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