蓝桥杯-历届试题解析-买不到的数目

历届试题-买不到的数目

问题描述

小明开了一家糖果店。他别出心裁:把水果糖包成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;
}

猜你喜欢

转载自blog.csdn.net/Jacksqh/article/details/105509224