小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
一: 简单算法
#include<iostream> using namespace std; int main () { int a, b; cin>>a>>b; cout<<a*b-(a+b)<<endl; return 0; }
二:常规算法
#include<iostream> using namespace std; int main () { int a[2] = {0}; long int c[100000] = {0}; cin>>a[0]>>a[1]; long int i, j; c[a[0]] = 1; c[a[1]] = 1; for(i = 0; i < 2; i++) { for(j = 0; j < 10000; j++) { if(c[j] == 1) c[j+a[i]] = 1; } } for(i = 10000; i >= 1; i--) if(c[i] == 0){ cout<<i<<endl; break; } return 0; }
常规这个算法只适合给的数字<=100的时候 如果大于 则出错(可以给他一个限定条件 就是范围不能超出你给的范围 (数组大小范围))
不过这个题目是1000以内 ~~
这个可以推出3个数字或多个数字不能构成的最大数字(如果这几个数字的最大公约数不为1 则为无穷个 否则为有限个 所以多个数字的时候先算出最大公约数(java的BigInteger中的.gcd算法))
然后在确定是否需要计算不能构成的最大数字~。