C++第11周项目2(1)参考——百钱百鸡

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565

【项目2:穷举法解决组合问题】先阅读例题,领会穷举法(意为“穷尽式列举”,也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法。

任务:利用穷举的方法解决下面的问题(选做一道即算完成任务,其他可以抽时间自由安排,多做会使你更聪明。)

(1)百钱百鸡问题:中国古代数学家张丘建在他的《算经》中提出了著名的“百钱买百鸡问题”:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?

提示:设鸡翁、鸡母、鸡雏的个数分别为x,y,z,题意给定共100钱要买百鸡,若全买公鸡最多买20只,显然x的值在0~20之间;同理,y的取值范围在0~33之间,可得到下面的不定方程:

5x+3y+z/3=100

x+y+z=100

所以此问题可归结为求这个不定方程的整数解。

由程序设计实现不定方程的求解与手工计算不同。在分析确定方程中未知数变化范围的前提下,可通过对未知数可变范围的穷举,验证方程在什么情况下成立,从而得到相应的解。

引申:这类求解不定方程的实现,各层循环的控制变量直接与方程未知数有关,且采用对未知数的取值范围上穷举和组合的方法来复盖可能得到的全部各组解。如果要采取技巧,往往是根据题意,更合理地设置循环控制条件来减少这种穷举和组合的次数,提高程序的执行效率,需要具体问题具体分析。

#include <iostream>
using namespace std;
int main()
{
	int x,y,z;       //定义数据类型为整型,买鸡和买烤鸡不是一个概念
	for(x=0;x<=20;++x)
		for(y=0;y<=33;++y)  //穷举中。。。。
			for(z=0;z<=300;++z)
				if(5*x+3*y+z/3==100 && x+y+z==100 && z%3==0)
				{
					cout<<"鸡翁"<<x<<"只,鸡母"<<y<<"只,鸡雏"<<z<<"只。"<<endl;
				}
	return 0;
}

运行结果:

改进一:

#include <iostream>
using namespace std;
int main()
{
	int x,y,z;       //定义数据类型为整型,防止出现买烤鸡情况的出现
	for(x=0;x<=20;++x)
		for(y=0;y<=33;++y)
			for(z=0;z<=300;z+=3)  //既然z要整除3,每次自加3去保证,少了循环,也少了判断
				if(5*x+3*y+z/3==100 && x+y+z==100)
				{
					cout<<"鸡翁"<<x<<"只,鸡母"<<y<<"只,鸡雏"<<z<<"只。"<<endl;
				}
	return 0;
}

改进二:

#include <iostream>
using namespace std;
int main()
{
	int x,y,z;
	for(x=0;x<=20;++x)
		for(y=0;y<=33;++y)
		{
			z=100-x-y;   //鸡雏数就此确定,何须再去试探——穷举只是笨办法,人可以让计算机轻松些
			if(5*x+3*y+z/3==100&&z%3==0)
					cout<<"鸡翁"<<x<<"只,鸡母"<<y<<"只,鸡雏"<<z<<"只。"<<endl;
		}
	return 0;
}
时间: 2024-11-03 13:17:20

C++第11周项目2(1)参考——百钱百鸡的相关文章

2013-C++第11周项目参考解答链接集

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 完整题目见:http://blog.csdn.net/sxhelijian/article/details/14109337 [项目1-调用函数输出星号图] 参考解答见:http://blog.csdn.net/sxhelijian/article/details/14548417 [项目2-求最大公约数]输入两个数,并求出其最大公约数 [项目2扩展-求四数的最大公约数]

C++第11周项目1、2 - 点类派生出直线类

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8894095 [项目1]定义点类,并以点类为基类,派生出直线类,从基类中继承的点的信息表示直线的中点.请阅读下面的代码,并将缺少的部分写出来. #include<iostream> #include<Cmath> using namespace s

2014秋C++第11周项目5参考-当年第几天

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目5-当年第几天]定义一个函数,其参数为年.月.日的值,返回这一天为该年的第几天.要求在main函数中输入年月日,然后调用这个函数求值,并在main函数中输出结果. int days(int y, int m, int d); int main() { int year, month,

2014秋C++第11周项目6参考-回文、素数

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目6-回文.素数](1)编制一个函数reverse,返回给定数据的"反序数",例如输入1234,输出4321.请编制reverse函数,在下面代码的基础上补充相关的部分,实现要求的功能. int main() { int m,n; cin>>m; n=re

2014秋C++第11周项目4参考-特殊三位数

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.   [项目4-特殊三位数]请输出满足条件n=a!+b!+c!的所有三位数n,其中,a.b.c分别是n的百.十.个位数.要求用自定义函数实现求阶乘. int main() { } long fac(int n) //用于求n的阶乘 { } 参考解答: #include<iostream&g

2014秋C++第11周项目1参考-函数版星号图

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.   [项目1-函数版星号图]这一组的练习意在通过调用函数输出星号图,体会与理解函数的工作过程,并为其后编制自定义函数实现特定功能.(1)补充完下面的程序,使程序输出星号图: #include <iostream> using namespace std; void printsta

C++第11周项目2(9)参考——污损的数字

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2:穷举法解决组合问题]先阅读例题,领会穷举法(意为"穷尽式列举",也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法. 任务:利用穷举的方法解决下面的问题(选做一道即算完成任务,其他可以抽时间自由安排,多做会使你更聪明.) (9)有等式[※×(※3+※)]^2=8※※9,其中※处为1个数字,滴上了墨水无法辨认.请编程找出※表示哪个数字.

C++第11周项目2(8)参考——软件比拼

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2:穷举法解决组合问题]先阅读例题,领会穷举法(意为"穷尽式列举",也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法. 任务:利用穷举的方法解决下面的问题(选做一道即算完成任务,其他可以抽时间自由安排,多做会使你更聪明.) (8)下列乘法算式中:每个汉字代表1个数字(1~9).相同的汉字代表相同的数字,不同的汉字代表不同的数字.试编程确定

C++第11周项目2(7)参考——都要学C

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 [项目2:穷举法解决组合问题]先阅读例题,领会穷举法(意为"穷尽式列举",也称枚举)的思想,然后自行选题进行解决,掌握这种程序设计的一般方法. 任务:利用穷举的方法解决下面的问题(选做一道即算完成任务,其他可以抽时间自由安排,多做会使你更聪明.) (7)在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字.请设计程序求出"都.要.学.