歷屆試題 買不到的數目
阿新 • • 發佈:2019-03-01
得到 spa continue bits bit true 形式 code 通過
樣例輸出1 17 樣例輸入2 3 5
樣例輸出2
7
思路:
首先定義一個上限,上限的值取為兩個數的最小公倍數 初始化(默認初始化為0)
對數組的元素開始往前處理
遇到的第一個值不能表示的元素輸出,而一個數能不能表示直接枚舉就行,從後向前只是更快找到答案 代碼一
問題描述
小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。
小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。
你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。
本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。
輸入格式兩個正整數,表示每種包裝中糖的顆數(都不多於1000)
輸出格式一個正整數,表示最大不能買到的糖數
樣例輸入1 4 7樣例輸出1 17 樣例輸入2 3 5
遇到的第一個值不能表示的元素輸出,而一個數能不能表示直接枚舉就行,從後向前只是更快找到答案 代碼一
1 #include<bits/stdc++.h> 2 using namespace std; 3 int test(int m,int n,int num) 4 { 5 int s=0; 6 for(int i=0;i<=n;i++) 7 { 8 for(int j=0;j<=m;j++){ 9 if(num==(m*i+n*j)){ 10 s=1; 11 } 12 } 13 if(s==1) break; 14 } 15 return s; 16 } 17 int gcd(int m,int n) 18 { 19 int a=1; 20 int i=2; 21 while(true){ 22 if(i>=min(m,n)){23 break; 24 } 25 if(m%i==0 && n%i==0){ 26 m/=i; 27 n/=i; 28 a*=i; 29 continue; 30 } 31 else{ 32 i++; 33 } 34 35 } 36 return a*m*n; 37 } 38 int main() 39 { 40 int m; 41 int n; 42 cin >> m >> n; 43 int s=gcd(m,n); 44 int Big=1; 45 for(int i=s-1;i>=1;i--) 46 { 47 if(test(m,n,i)==0) { 48 Big=i; 49 break; 50 } 51 } 52 cout << Big << endl; 53 return 0; 54 }
為啥上限是最小公倍數?
一種比較好理解的思路是:以29為例,如果28可以,那麽29一定可以。因為2個4減去一個7等於1。也就是用兩個4替換一個7。30也一定可以,因為可以用2個7替換3個4,以此類推。無論此時的數與最小公倍數m差多少,一定可以通過把i個4換成j個7的形式得到。
下面是網上的一個答案
代碼二
1 #include<iostream> 2 3 4 5 using namespace std; 6 7 8 9 int main() 10 11 { 12 13 14 15 int a,b; 16 17 cin>>a>>b; 18 19 cout<<a*b-a-b<<endl; 20 21 22 23 }
這種是直接用了定理(擴展歐幾裏得)、
自然數a,b互質,則不能表示成ax+by(x,y為非負整數)的最大整數是ab-a-b.
證明:
a或者b是1的情況下容易證明.
以下情況都是a>1且b>1的情況.
首先證明ab-a-b不能表示成ax+by
假設ab-a-b=ax+by,那麽ab=am+bn (m,n都大於等於1)
左邊是a的倍數,右邊am是a的倍數,那麽要求bn也要是a的倍數
b不是a的倍數,只能要求n是a的倍數,這樣的話,bn=bn’a>=ba
那麽am=ab-bn<=0就與am>1矛盾.
歷屆試題 買不到的數目