c#算法
卖1020个西瓜`每天卖一半西瓜多2个`依次类推要卖几天可以卖玩--------------------编程问答--------------------
int total = 1020;--------------------编程问答-------------------- 楼上正解 --------------------编程问答-------------------- good --------------------编程问答-------------------- 頂 --------------------编程问答-------------------- 8天 --------------------编程问答-------------------- 小于2的8次方大于2的7次方,所以是8天.
int days = 0;
while (total > 0)
{
total -= (total / 2) + 2;
Console.WriteLine(total);
days++;
}
Console.WriteLine("{0} days", days);
--------------------编程问答-------------------- 对楼上不赞同,假如是每天卖一半西瓜多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;--------------------编程问答-------------------- 楼上的减 2 加 2 可以叫停了,有了 9 楼的数学根据,就可以直接二进制移位(除以 2)搞定了。 --------------------编程问答-------------------- 6 楼喊 8 天的,如果每天卖一半多 1 个,会卖 9 天,如果每天正好卖一半,要卖 11 天。误人子弟啊
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,是不是应该考虑四舍五入。
补充:.NET技术 , C#