问题 1427: [蓝桥杯][2013年第四届真题]买不到的数目

小明的糖果店使用4颗和7颗一包的水果糖进行组合销售,但某些数目无法组合出来。例如,10颗糖无法组合。本题要求根据给定的每种包装糖的数量,找出最大无法购买的糖果数。输入为两个正整数,输出为最大无法组合的数。当输入为4和7时,最大无法组合的数是17。正确解法是利用公式a*b-a-b,但需考虑输入是一奇一偶或两奇的情况。
摘要由CSDN通过智能技术生成

题目描述

小明开了一家糖果店。他别出心裁:把水果糖包成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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值