历届试题-买不到的数目
问题描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入格式
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出格式
一个正整数,表示最大不能买到的糖数
样例输入1
4 7
样例输出1
17
样例输入2
3 5
样例输出2
7
结论:可以用枚举也可以用数论
ax+by=C 推出x,y都大于0
x,y互质一定有解,而且有无穷多解
题目的条件:①.一定有解(互质:最大公约数为1)
②.x,y都是大于等于0的整数,着这个限定条件下有的C是无解的,
上界至多是ab(因为a,b互质所以ab为最小公倍数,则在这之上都是一定可以有解的)
枚举:
#include<iostream>
#include<Windows.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
for(long long test=a*b-1;test>0;test--){
long long temp=test;//temp尽量大点用long long 类型
bool ret=false;
while(temp>0){
if(temp%b==0){
ret=true;
break;
}else{
temp-=a;
}
}
//看temp能不能被a整除(条件则是temp不能被b整除)
if(ret==false){
temp=test;
while(temp>0){
if(temp%a==0){
ret=true;
break;
}else{
temp-=b;
}
}
}
//如果a和b不能构成temp直接输出test(因为是从大到小枚举的)
if(ret==false){
cout<<test<<endl;
break;
}
//system("pause");暂停观察结果
return 0;
}
}
数论:(公式:a*b-(a-b)为最大不能构成的数)
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a*b-(a-b)<<endl;
return 0;
}