当前位置:编程学习 > C#/ASP.NET >>

c#算法

卖1020个西瓜`每天卖一半西瓜多2个`依次类推要卖几天可以卖玩

--------------------编程问答--------------------
        int total = 1020;
        int days = 0;

        while (total > 0)
        {
            total -= (total / 2) + 2;
            Console.WriteLine(total);
            days++;
        }

        Console.WriteLine("{0} days", days);
--------------------编程问答-------------------- 楼上正解 --------------------编程问答-------------------- good --------------------编程问答-------------------- 頂 --------------------编程问答-------------------- 8天 --------------------编程问答-------------------- 小于2的8次方大于2的7次方,所以是8天.
--------------------编程问答-------------------- 对楼上不赞同,假如是每天卖一半西瓜多508个,还是8天?

1020
512/508
256/252
128/124
64/60
32/28
16/12
8/4
4/0
--------------------编程问答-------------------- total -= (total / 2) + 2;
可以优化成: total = total/2 -2;吧,少一次运算.
但输入不一样,这个算易做图有边界情况发生,比如最后一天剩少于4个. --------------------编程问答-------------------- 这更像一道数学题

总数:int m = 1020;
销存差:int n = 2;

第 1 天的销售量 fx(1) = m / 2 + n; 
第 1 天的库存量 fc(1) = m / 2 - n; 

第 2 天的销售量 fx(2) = fc(1) / 2 + n; 
第 2 天的库存量 fc(2) = fc(1) / 2 - n; 

看到这里,作为程序员一眼就看出递归了。不过按照数学的思路走下去,还有东西可挖。

如上述:
fx(1) = m / 2 + n; (式1)
fc(1) = m / 2 - n; (式2)
(式1)减(式2)得:
fx(1) - fc(1) = n * 2; 
变形得:
fc(1) = fx(1) - n * 2; (式3)
将(式3)代入上述fx(2)的公式:
fx(2) = fc(1) / 2 - n; 
      = (fx(1) - n * 2) / 2 + n; 
      = fx(1) / 2 - n + n; 
      = fx(1) / 2
由此得到该命题的推导公式:
fx(t) = fx(t - 1) / 2
      = (fx(t - 2) / 2) / 2
      ......

继而可以推理出:
fx(t) = fx(t - a) / (2 ^ a) 
      注:(2 ^ a) 代表 2 的 a 次方

然后我们这道题目其实求的是 fc(x) <= 0; 的时候,x(天数)是多少。

根据题目,我们假设 fc(0) = 1020;(第 0 天,也就是销售之前的库存量是1020)
根据(式3)得知:fx(0) = 1024;
然后设计循环累加天数,同时除以 2,到 fc(x) <= 0; 结束,根据(式3),结束条件可改为 fx(x) <= 4;

using System;

class Program
{
    static void Main(string[] args)
    {
        int m = 1020;
        int n = 2;
        int x = 0;
        for (m += n * 2; m > n * 2; m >>= 1)
            x++;
        Console.WriteLine(x);
    }
}
--------------------编程问答-------------------- 楼上的减 2 加 2 可以叫停了,有了 9 楼的数学根据,就可以直接二进制移位(除以 2)搞定了。 --------------------编程问答-------------------- 6 楼喊 8 天的,如果每天卖一半多 1 个,会卖 9 天,如果每天正好卖一半,要卖 11 天。误人子弟啊

我也自己纠正自己个错误,除以 2,是不是应该考虑四舍五入。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,