百钱百鸡问题的探讨
话不多说上题目
鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
意思呢?非常简单,我就不翻译了。今天要做的事情呢,就是用C语言和我们的数学才能 来 不断的优化,不断的优化,不断的优化,从而找到最优解。
解法一:枚举法(不错过每一次循环)
int main()
{
int rt,hn,ck;
for (rt = 0; rt <= 100; rt++)
{
for (hn = 0; hn <= 100; hn++)
{
for (ck = 0; ck <= 100; ck++)
{
if (rt * 5 + hn * 3 + ck /3.0 == 100&&rt+ck+hn==100)
printf("rt=%d,hn=%d,ck=%d\n", rt, hn, ck);
}
}
}
return 0;
}
看一看,上面短短代码经过了几次循环?10^6+次!你的CPU已经在默默哭泣。
当然了,上面不排除我故意为之的行径,好让大家看到数学的魅力。
解法二:进行优化(认真思考)
上面题解中我们是将每种情况都一一列举出来,然后再进行检验,然后我们思考一下,有必要将每种情况都列举吗?有必要进行三套循环吗?
经分析
优化一:最简单也是最容易想到的,去掉第三层循环,只保留两层,令ck=100-rt-hn即可
优化二:rt值5元,共百钱,so rt<20也;同理可得,hn<33也。这就令循环数从10^6减少到66次。(妙啊)
优化三:可以从避免重复计算,避免重复判断,避免…(想让计算机shaopaodian,就要自己多思考点)
废话不多说上代码
int main()
{
int rt, hn;
for (rt = 0; rt <=20; rt++)
{
for (hn = 0; hn <33; hn++)
{
if (7 * rt + 4 * hn == 100)
//人工计算化简,相当于做一次小学解方程组。
printf("rt=%d,hn=%d,ck=%d\n", rt, hn, 100-rt-hn);
}
}
return 0;
}
解法三:最强优化(运用数论)
我们仔细观察该式:7 * rt + 4 * hn == 100,得出rt=(100-4hn)/7,rt最小值为14(当hn=0时),并可以推出rt其实是4的倍数,rt最大值就为12,hn=(100-7rt)/4。
分析完毕,上代码!
int main()
{
int rt, hn;
for (rt = 0; rt <=12; rt=rt+4)
{
hn = (100 - 7 * rt) / 4;
printf("rt=%d,hn=%d,ck=%d\n", rt, hn, 100 - rt - hn);
}
return 0;
}
总结
经过我们的层层分析及 不断的优化,不断的优化,不断的优化 ,我们将循环10^6次循环减少到4次,是在妙不可言。
最后不妨关注一下新人,我是第 一 步,我将进行持续更新
天舟升空,星辰大海征途远
疲惫尽洗,代码世界梦待圆