历届试题 买不到的数目
问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
两个正整数,表示每种包装中糖的颗数(都不多于1000)
一个正整数,表示最大不能买到的糖数
遇到的第一个值不能表示的元素输出,而一个数能不能表示直接枚举就行,从后向前只是更快找到答案
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矛盾.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!