1. 程式人生 > >歷屆試題 買不到的數目

歷屆試題 買不到的數目

得到 spa continue bits bit true 形式 code 通過

問題描述

小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。

小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。

你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。

本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。

輸入格式

兩個正整數,表示每種包裝中糖的顆數(都不多於1000)

輸出格式

一個正整數,表示最大不能買到的糖數

樣例輸入1 4 7
樣例輸出1 17 樣例輸入2 3 5
樣例輸出2 7 思路: 首先定義一個上限,上限的值取為兩個數的最小公倍數 初始化(默認初始化為0) 對數組的元素開始往前處理
遇到的第一個值不能表示的元素輸出,而一個數能不能表示直接枚舉就行,從後向前只是更快找到答案
代碼一
 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矛盾.

歷屆試題 買不到的數目