一道数学问题的程序解答

问题:

如果小明在某一周的第一天和第三天分别吃了3个水果,且从这周第二天开始,每天所吃的水果个数与前一天相比,仅存在三种可能:或“多一个”或“持平”或“少一个”,那么,小明在这一周中每天所吃水果个数的不同选择方案共有几种?


如果用计数原理还真有些不好做,星期一的可能为2,3,4,星期四可能2,3,4,星期五可能为1,2,3,4,5,依次类推,但不可以按此计算分步原理

每一步在上一步的其基础上只有3种可能,共有3*3*3*3*3=243种,当然里面包含了为负数的情况,排除即可,从星期四开始2-1-0-(-1),仅此一种,星期二有3种,故不成立的有3种情况,所以共有240种。

            ArrayList AL = new ArrayList();
            //星期四
            for (int i = 2; i <= 4; i++)
            {
                //星期五
                string s = i + "-";
                for (int k = i - 1; k <= i + 1; k++)
                {
                    s += k + "-";
                    string fri = s;
                    //星期六
                    for (int j = k - 1; j <= k + 1; j++)
                    {
                        s += (j >= 0 ? j : 0).ToString() + "-";
                        string sat = s;
                        //星期天
                        for (int p = j - 1; p <= j + 1; p++)
                        {
                            s += (p >= 0 ? p : 0).ToString();
                            AL.Add(s);
                            s = sat;
                        }
                        s = fri;
                    }
                    s = i + "-";
                }
            }

            Response.Write("总共" + AL.Count.ToString() + "<br/>");
            //检查重复
            for (int i = 0; i < AL.Count; i++)
            {
                for (int j = i + 1; j < AL.Count; j++)
                {
                    if (AL[j].ToString() == AL[i].ToString())
                    {
                        AL.Remove(AL[j]);
                        j--;
                    }
                }
            }
            Response.Write("去掉重复总共总共" + AL.Count.ToString() + "<br/>");

            for (int i = 0; i < AL.Count; i++)
            {

                Response.Write(AL[i] + ";");
                if ((i + 1) % 10 == 0)
                {
                    Response.Write("<br/>");
                }
            }
          


总共81
去掉重复总共总共80
2-1-0-0;2-1-0-1;2-1-1-0;2-1-1-1;2-1-1-2;2-1-2-1;2-1-2-2;2-1-2-3;2-2-1-0;2-2-1-1;
2-2-1-2;2-2-2-1;2-2-2-2;2-2-2-3;2-2-3-2;2-2-3-3;2-2-3-4;2-3-2-1;2-3-2-2;2-3-2-3;
2-3-3-2;2-3-3-3;2-3-3-4;2-3-4-3;2-3-4-4;2-3-4-5;3-2-1-0;3-2-1-1;3-2-1-2;3-2-2-1;
3-2-2-2;3-2-2-3;3-2-3-2;3-2-3-3;3-2-3-4;3-3-2-1;3-3-2-2;3-3-2-3;3-3-3-2;3-3-3-3;
3-3-3-4;3-3-4-3;3-3-4-4;3-3-4-5;3-4-3-2;3-4-3-3;3-4-3-4;3-4-4-3;3-4-4-4;3-4-4-5;
3-4-5-4;3-4-5-5;3-4-5-6;4-3-2-1;4-3-2-2;4-3-2-3;4-3-3-2;4-3-3-3;4-3-3-4;4-3-4-3;
4-3-4-4;4-3-4-5;4-4-3-2;4-4-3-3;4-4-3-4;4-4-4-3;4-4-4-4;4-4-4-5;4-4-5-4;4-4-5-5;
4-4-5-6;4-5-4-3;4-5-4-4;4-5-4-5;4-5-5-4;4-5-5-5;4-5-5-6;4-5-6-5;4-5-6-6;4-5-6-7;


四层嵌套循环,还要适时的重置字符串,先写出程序,再分析出问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值