不能买到的数

on_way_ 2013-05-12 03:52:41
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)

要求输出:
一个正整数,表示最大不能买到的糖数

例如:
用户输入:
4 7
程序应该输出:
17
PS:其实这里两包糖的数目应该是互素的,要不没有答案。
...全文
1581 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
erqieshi 2013-05-21
  • 打赏
  • 举报
回复
上面的有误

#include <stdio.h> 
#include <stdlib.h>
//判断两数是否互素//若为真时调整了PQ顺序 P>Q
bool IsCoprime(int P,int Q)
{
	if (P<2 || Q<2 ||P == Q)
	{
		return false;
	}
	int tmp = P;	
	while (Q) tmp=P, P=Q, Q=tmp%Q;	
	return (P==1);//这里的P就是最大公约数
}
//输入P、Q
//给出a、b非负且满足a*P - b*Q = 1;且b最小的a、b
bool GetRatio(int P,int Q,int& a,int& b)
{
	// 	if (!IsCoprime(P,Q))
	// 	{
	// 		return FALSE;
	// 	}
	for (b=1;b<P;b++)
	{
		if ((b*Q+1)%P == 0)
		{
			a = (b*Q+1)/P;
			break;
		}
	}	
	
	return true;
}
void PrintOut(int p,int q)
{
	int a=0;int b=0;
	int c=0;int d = 0;
	if (p==1||q==1)
	{
		printf("%d,%d任何正数都买的到\n",p,q);
	}
	else if (IsCoprime(p,q))
	{
		GetRatio(p,q,a,b);
		GetRatio(q,p,c,d);
		printf("%d,%d买不到的最大数是:%d\n",p,q,(b-1)*q + (d-1) * p+1);
	}
	else
	{
		printf("%d,%d买不到的最大数是:无穷大\n",p,q);
	}
	
}
int main()
{
	PrintOut(1,5);
	PrintOut(2,7);
	PrintOut(6,7);
	PrintOut(4,7);
	PrintOut(2,3);
	PrintOut(3,4);
	PrintOut(6,9);
	PrintOut(7,5);
	PrintOut(93,44);
	PrintOut(193,744);
	PrintOut(744,193);
	system ("pause");
    return 0;
}
erqieshi 2013-05-21
  • 打赏
  • 举报
回复
时间复杂度O(p+q) 空间复杂度O(1)
erqieshi 2013-05-21
  • 打赏
  • 举报
回复
#include <stdio.h> 
#include <stdlib.h>
//判断两数是否互素//若为真时调整了PQ顺序 P>Q
bool IsCoprime(int P,int Q)
{
	if (P<2 || Q<2 ||P == Q)
	{
		return false;
	}
	int tmp = P;	
	while (Q) tmp=P, P=Q, Q=tmp%Q;	
	return (P==1);//这里的P就是最大公约数
}
//输入P、Q
//给出a、b非负且满足a*P - b*Q = 1;且b最小的a、b
bool GetRatio(int P,int Q,int& a,int& b)
{
	// 	if (!IsCoprime(P,Q))
	// 	{
	// 		return FALSE;
	// 	}
	for (b=1;b<P;b++)
	{
		if ((b*P+1)%P == 0)
		{
			a = (b*P+1)/P;
			break;
		}
	}	
	
	return true;
}
void PrintOut(int p,int q)
{
	int a=0;int b=0;
	int c=0;int d = 0;
	if (IsCoprime(p,q))
	{
		GetRatio(p,q,a,b);
		GetRatio(q,p,c,d);
		printf("%d,%d买不到的最大数是:%d\n",p,q,(b-1)*q + (d-1) * p);
	}
	else
	{
		printf("%d,%d买不到的最大数是:无穷大\n",p,q);
	}
	
}
int main()
{
	PrintOut(3,4);
	PrintOut(6,9);
	PrintOut(7,5);
	PrintOut(93,44);
	PrintOut(193,744);
	PrintOut(744,193);
	system ("pause");
    return 0;
}
anshiny 2013-05-21
  • 打赏
  • 举报
回复
#include<stdio.h>
#define MAXSIZE 1000
int main() {
	int flag[MAXSIZE] = {0};
	int maxunuse[MAXSIZE] = {0};
	int num1, num2, minNum, maxNum, temp, i, count = 0;
	scanf("%d%d", &num1, &num2);
	minNum = ((num1 < num2) ? num1 : num2);
	maxNum = num1 + num2 - minNum;
	for(i = 1; ;i++){
		temp = i * maxNum % minNum;
		if((temp) && flag[temp] == 0){
			flag[temp] = 1;
			maxunuse[temp] = i * maxNum -minNum;
			count++;
			if(count == minNum - 1){
				break;
			}
		}
	}
	printf("%d\n", maxunuse[temp]);
	return 0;
}
如果这个程序的结果是Accept,我再对代码做解释。
Defonds 2013-05-21
  • 打赏
  • 举报
回复
source 都贴出来了
huan_ji 2013-05-19
  • 打赏
  • 举报
回复
package hgh.com_1; import java.util.Scanner; public class T9 { public static void main(String[] args) { int max=0; int num1=0,num2=0; String strTemp=""; Scanner scan=new Scanner(System.in); strTemp=scan.nextLine(); String temp[]=strTemp.split(" "); num1=Integer.valueOf(temp[0]); num2=Integer.valueOf(temp[1]); int maxNum=Math.max(num1, num2); int minNum=Math.min(num1, num2); int temNum1,temNum2; max=maxNum*maxNum; for(int i=max;i>maxNum;i--){ temNum1=i/maxNum; if(i%maxNum!=0&&i%minNum!=0) for(int v=temNum1;v>=1;v--){ temNum2=i-maxNum*v; if(temNum2%minNum!=0){ temNum1--; } } if(temNum1==0){ System.out.println(i); break; } } } }
就是那个党伟 2013-05-13
  • 打赏
  • 举报
回复
suseyaoyao 2013-05-13
  • 打赏
  • 举报
回复

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧