百钱买百鸡问题

转自:http://blog.csdn.net/chinacsharper/article/details/13288009


题目:用100文钱买来100只鸡,公鸡5文钱一只,母鸡3文钱一只,小鸡1文钱3只。问:在这100只鸡中,公鸡、母鸡、小鸡各是多少只?


这个问题很像上学时期所解的数学难题,现在直接可以用程序运行得出。

针对原创,这里把实现提取出来作为一个函数,可以随意改变100文钱与100只鸡,变为其它的数字,代码如下,比较简单,就不详细说明了。


#include "stdafx.h"
#include <iostream>

using namespace std;

void calculate(int x)
{
	for(int i = 0; i <= x/5; ++i)
	{
		for(int j = 0; j <= x/3; ++j)
		{
			for(int k = 0; k <= x; ++k)
			{
				if( (i * 5 + j * 3 + k / 3 == x) && (i + j + k == x) && (k % 3 == 0) )
				{
					cout << "公鸡:" << i << " 母鸡:" << j << " 小鸡:" << k << endl; 
				}
			}
		}
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	calculate(1000);
	return 0;
}


今天又看到一道类似的题目,是华为的笔试题,触发了我的思考,以下是我的一点改善,同样也是基于数学,只不过和另外的帖子所求不同,所以不能优化到最精简。

另一个参考帖子:http://blog.csdn.net/wujunokay/article/details/13431571

设公鸡为 i ,母鸡为 j ,小鸡为 z 。

它们的关系为:

5 i + 3 j + z / 3 = 100 ;

i + j + z = 100 ;

z % 3 = 0 ;

由以上3个等式,可以化简得:7 i + 4 j = 100 ; 即 j = (100 - 7 i) / 4 ;

所以在 j 的判断里改成如上判断,然后由于 z 需要被 3 整除,固当if语句里满足条件时,就 z += 3 ;由于 z 本身就有 z++ ;所以就  z +=2 .

把判断条件修改了,再用counti 、 countj 、countz来统计循环的次数,结果表明循环的次数少了,但是次数还是很多,下次有新的优化再贴出。

代码如下:

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <assert.h>

using namespace std;

#define Number 100

int calculate(int x)
{
	int counti = 0, countj = 0, countk = 0 ;
	int count = 0 ;
	for(int i = 0; i <= x/5; ++i)
	{
		counti++;
		for(int j = 0; j <= x/3; ++j)
		{
			countj++;
			for(int k = 0; k <= x; ++k)
			{
				countk++;
				if( (i * 5 + j * 3 + k / 3 == x) && (i + j + k == x) && (k % 3 == 0) )
				{
					//cout << "公鸡:" << i << " 母鸡:" << j << " 小鸡:" << k << endl; 
					count++ ;
				}
			}
		}
	}
	cout << "counti = " << counti << " countj = " << countj << " countk = " << countk << endl;
	return count;
}

int optimizeS(int x)
{
	int count = 0 ;
	int counti = 0, countj = 0, countk = 0 ;
	for(int i = 0; i <= x/5; ++i)
	{
		counti++;
		for(int j = 0; j <= ((100 - 7*i) / 4); ++j)
		{
			countj++;
			for(int k = 0; k <= x; ++k)
			{
				countk++;
				if( (i * 5 + j * 3 + k / 3 == x) && (i + j + k == x) && (k % 3 == 0) )
				{
					//cout << "公鸡:" << i << " 母鸡:" << j << " 小鸡:" << k << endl; 
					k += 2;
					count++;
				}
			}
		}
	}
	cout << "counti = " << counti << " countj = " << countj << " countk = " << countk << endl;
	return count;
}


int _tmain(int argc, _TCHAR* argv[])
{
	int result = 0 ;
	calculate(Number);
	cout << "\n\n" << endl;
	result = optimizeS(Number);
	//assert(result == calculate(Number));
	return 0;
}

结果如下:



总体的优化如上,以上仅仅本人目前的学识所解,如有更加优化的地方欢迎指出,共同学习。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值