算法-

//百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,

//100文钱买一百只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱。

+(void)arithmetic

{

    // 设公鸡 x, 母鸡y,小鸡z, 5x+3y+z/3=100;x<20,y<33,z=100-x-y.

    int totalMoney = 10001;

    int totalChicken = 10001;

    int iMax = totalMoney/5;

    int jMax = totalMoney/3;

    int z = 0;

    

    for (int i = 1; i < iMax; i++)

    {

        for (int j = 1; j < jMax; j++)

        {

            int k = 3*(totalMoney-5*i-3*j);

            if (k<0)

            {

                continue;

            }

            if (totalChicken == i+j+k)

            {

                z++;

                NSLog(@"i = %d,j = %d, k = %d", i,j,k);

            }

        }

    }

    if (0==z)

    {

        NSLog(@"无解");

    }

    else

    {

        NSLog(@"共有%d组解",z);

    }

    /*

    总结,时间复杂度o(n^2);

    i = 4,j = 18, k = 78

    i = 8,j = 11, k = 81

    i = 12,j = 4, k = 84

    i4递增,j7递减,k3递增 n为鸡数,m为钱数

     5x+3y+(n-x-y)/3 = m

     15x +9y + n-x-y = 3m

     14x+8y=3m-n

     7x+4y = (3m-n)/2;

     y = [(3m-n)/2 -7x]/4

    */

    int total = 3*totalMoney - totalChicken;

    if ((total&1))

    {

        NSLog(@"数据不对");

        return;

    }

    for (int i = 1; i < total/14; i++)

    {

        if (0 == (total/2 - 7*i)%4)

        {

            int j = (total/2 - 7*i)/4;

            if (j>0)

            {

                int k = totalChicken - i- j;

                if (k>0)

                {

                    NSLog(@"i = %d,j = %d, k = %d", i,j,k);

                }

            }

        }

    }

    //算法复杂度o(n)

    

    /*

     代数解法ax+by = c有整数解充分必要条件是(a,b|c

     假设不定方程特解为x0,y0,(7,4)1;方程解的形式

     x=x0-bty=y0+at,t=0,1,2,3...(x0是从最小开始,t取负数)

     从这里看出解呈现等差现象,这个可以直接获得解,去除了3/4无效循环。

     */

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值