题目描述
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入
两个正整数,表示每种包装中糖的颗数(都不多于1000)
输出
一个正整数,表示最大不能买到的糖数
样例输入
4 7
样例输出
17
Code
正确的代码在最下面,中间的是处理的过程,代码不一定是正确的
最方便的是根据公式直接求得a*b-a-b
存在一个问题:如果输入的两个数都是偶数,那么最大不能表达数将会是未知数
所以输入的情况只有两种:两个奇数 或 一奇一偶
分析
输入: 4 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
0 0 3 4 0 6 7 8 9 10 11 12 13 14 15 16 0
5
--------------------------------
输入: 4 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
0 0 0 4 0 0 7 8 0 0 11 12 0 14 15 16 0 18 19 20 21 22 23 24 25 26 27 28
两者之间的差:7-4=3
Step 1:将4的倍数先计算出来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
4 8 12 16 20 24 28
step 2:在4的i倍基础上,加上3*1 3*2 ... 3*i
4的1倍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
4 7 8 12 16 20 24 28
4的2倍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
4 8 11 12 14 16 20 24 28
...
4的n倍,归总
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
0 0 0 4 0 0 7 8 0 0 11 12 0 14 15 16 0 18 19 20 21 22 23 24 25 26 27 28 ...
找规律
输入: 4 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
0 0 3 4 0 6 7 8 9 10 11 12 13 14 15 16 0
*
输入: 4 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
0 0 0 4 5 0 0 8 9 10 0 12 13 14 15 16 17 18 19 20 21 22 23 24 25 0
*
输入: 4 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
0 0 0 4 0 0 7 8 0 0 11 12 0 14 15 16 0 18 19 20 21 22 23 24 25 26 27 28
*
输入: 4 9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
0 0 0 4 0 0 0 8 9 0 0 12 13 0 0 16 17 18 0 20 21 22 0 24 25 26 27 28 29 30 31 32 33 34 35 36
*
好吧,没有找到任何的倍数规律,但是发现一个现象,任何一个不可能组成的数是不会超过b*b(b>a)
Right Code
#include<stdio.h>
int ar[1000000]={0};
//将a的1~n次方存入输入对应位置,然后将a的i次方加上(b-a)的0~i次方存入对应位置
//最大不可能组成的数字是不会超过b*b(前提:b>a)
void Plus(int a,int b)
{
int i,j,difer,num;
difer=b-a;
for(i=1;a*i<=b*b;i++){
for(j=0;j<=i;j++){
num=a*i+j*difer;
ar[num]=num;
}
}
return;
}
int main()
{
int a,b,i,t;
scanf("%d%d", &a,&b);
if(a>b){//ensure b>a
t=a; a=b; b=t;
}
//进行数组存数
Plus(a,b);
//从尾向前查找没有存入的数,即为最大无法组成的数
for(i=b*b;;i--)
if(ar[i]==0) break;
printf("%d\n", i);
return 0;
}
Test Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int ar[1000]={0};
int Plus(int a,int b)
{
int cnt=0,i,j,difer;
difer=b-a;
for(i=1;i<=b;i++){
for(j=0;j<=i;j++){
ar[i*a+j*difer]=i*a+j*difer;
if(i*a+j*difer>cnt) cnt=i*a+j*difer;
}
}
for(;i*a<cnt;i++)
ar[i*a]=i*a;
return cnt;
}
int main()
{
int a,b,cnt,t,i;
scanf("%d %d", &a,&b);
if(a>b){
t=a; a=b; b=t;
}
cnt=Plus(a,b);
for(i=1;i<=cnt+1;i++)
printf("%-3d ", i);
printf("\n");
for(i=1;i<=cnt+1;i++)
printf("%-3d ", ar[i]);
for(i=(b-a)*a;i<=(b-a+1)*a;i++)
if(ar[i]==0) break;
printf("\n%d\n", i);
return 0;
}