c++ (优化)百钱买百鸡

问题

百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用100文钱买100只鸡,公鸡、母鸡、小鸡各买多少只

第一种方法

三层循环(穷举法)

#include <iostream>

using namespace std;

int main()
{
     int x,y,z; //分别是小鸡、公鸡、母鸡
     for(x=3; x<100 ;){
        for(y=0;y<34;y++){
            for(z=0;z<20;z++){
                if( ( (x/3) + 3*y + 5*z)== 100 && (x+y+z)==100){
                    cout<<"母鸡:"<<z;
                    cout<<"公鸡:"<<y;
                    cout<<"小鸡:"<<x<<endl;
                }
            }
        }
        x = x+3;
     }
}

用暴力破解
需要满足的方程 : x/3+3y+5z =100 、 x + y +z =100
其中100、34、20 均是计算得到的,用来进行范围缩小

结果如下

在这里插入图片描述

第二种方法

二层循环

#include <iostream>

using namespace std;

int main()
{
     int x,y,z; //分别是小鸡数的三分之一、公鸡、母鸡
     for (x=0; x<33 ; x++) {
        for (y=0;y<33;y++) {
            z = 100 -y - 3*x ;
            if ( (x + 3*y + 5*z ) == 100 && z > -1 ) {
                cout<<"母鸡:"<<z;
                cout<<"公鸡:"<<y;
                cout<<"小鸡:"<<3*x<<endl;
            }

        }

     }
}

需要满足的的方程 x + 3y + 5z = 100 、 3x + y + z = 100
x这里代表的是小鸡数量的三分之一
先穷举x,y, 然后通过方程 3
x + y + z = 100 得到 z(z可能为负数
最后只要满足 另外的一个方程z大于零

结果

在这里插入图片描述

第三种方法
#include <iostream>

using namespace std;

int main()
{
     int x,y,z;
     for (x=0; x<33 ; x++) {
        z = 4*x -100;
        y = 200 -7*x;
        if (z > -1 && y > -1) {
            cout<<"母鸡:"<<z;
            cout<<"公鸡:"<<y;
            cout<<"小鸡:"<<3*x<<endl;
        }

     }
}

首先 通过解方程 x + 3y + 5z = 100 、 3x + y + z = 100
得到y、z关于x的方程。(x这里代表的是小鸡数量的三分之一
即 y = 200 - 7
x 、z = 4*x - 100 (y,z都可能为负数
通过 穷举x解出的方程 得到 y、z的值

这里演示的是 穷举x来计算y、z。你也可以穷举y和z,只需要计算相应的方程即可。

结果

在这里插入图片描述
主要是通过方程,减少穷举和循环的次数。

  • 12
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值