转自: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;
}
结果如下:
总体的优化如上,以上仅仅本人目前的学识所解,如有更加优化的地方欢迎指出,共同学习。