- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:19108035856(电话支持时间:9:00-19:00)。
百钱买百鸡问题
Time Limit: 1 Sec Memory Limit: 2 MB Submit: 1120 Solved: 161 [Submit][Status][Web Board]
Description
“
“百钱买百鸡”是我国著名的古代数学问题,中国古代数学家张丘建在他的《算经》中提出了 这样一个问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
你的任务是求解下面这个问题。问题是这样描述的:a 文钱可买一只公鸡,b 文钱可买一只
母鸡,c 文钱可买d 只小鸡。用m 文钱买n 只鸡,那么有公鸡x 只、母鸡y 只、小鸡 z 只。求解出符合题意的x,y,z。
Input
输入为一张表。第一行是一个固定不变的表头,格式见
输入为一张表。第一行是一个固定不变的表头,格式见sample。后面有多行,每行为一组测试数据。每组测试数据由 6 个整数组成,分别为“a,b,c/d,m,n”。满足 0<a,b,c,d<=50, 50<=m,n<=108+1,并且母鸡和小鸡的单价不会相同。
Output
每组测试数据的运行结果输出为一张表,表头固定为
每组测试数据的运行结果输出为一张表,表头固定为“COCKS,HENS,CHICKS”。每组测试数 据的一个可行解数出为一行,为三个整数:“x,y,z”。多组解按照公鸡数从少到多的顺序输出。若测试数据无解则输出“Cannot buy!”。两组测试数据之间用一个空行分隔开。
Sample Input
COCK,HEN,CHICK,MONEY,CHICKS 3,2,1/3,100,100
COCK,HEN,CHICK,MONEY,CHICKS 3,2,1/3,100,100
5,3,1/3,100,100
8,5,1/7,100,100
8,5,1/7,300,300
Sample Output
COCKS,HENS,CHICKS 0,40,60
COCKS,HENS,CHICKS 0,40,60
5,32,63
5,32,63
10,24,66
15,16,69
20,8,72
25,0,75
COCKS,HENS,CHICKS
0,25,75
4,18,78
8,11,81
12,4,84
Cannot buy!
COCKS,HENS,CHICKS
8,40,252
HINT
本题重点在于了解多重循环的运行效率问题,减少一层循环可以降低很大规模的运算量。通
本题重点在于了解多重循环的运行效率问题,减少一层循环可以降低很大规模的运算量。通过在循环体内加计数器可以统计出循环的运行次数,当测试数据变大时,运行次数的增长会非常可观,这就是超时的原因了。
Append Code
#include <stdio.h> #include <math.h> int main()
{
char s[50];
long int a,b,m,n,x,y,z,flag; int c,d;
gets(s); while(scanf("%ld,%ld,%d/%d,%ld,%ld",&a,&b,&c,&d,&m,&n)!=EOF)
{
flag=0;
for(x=0; x<=n; x++)
{
if((((a-b)*x+b*n-m)*d)%(b*d-c)==0)
{
z=(((a-b)*x+b*n-m)*d)/(double)(b*d-c);
y=n-z-x;
if(fabs(a*x+b*y+z*c/(double)d-m)<0.000000001&&z*c%d== 0&&x>=0&&y>=0&&z>=0)
{
flag=1;
}
}
}
if(flag==0)
printf("Cannot buy!\n");
else
{printf("COCKS,HENS,CHICKS\n");
for(x=0; x<=n; x++)
{
if((((a-b)*x+b*n-m)*d)%(b*d-c)==0)
{
z=(((a-b)*x+b*n-m)*d)/(double)(b*d-c); y=n-z-x;
if(fabs(a*x+b*y+z*c/(double)d-m)<0.000000001&&z*c%d== 0&&x>=0&&y>=0&&z>=0)
{
printf("%ld,%ld,%ld\n",x,y,z);
}
}
}
}
printf("\n");
}
return 0;
}
文档评论(0)