【问题标题】:C# riddle : implement interfaceC#之谜:实现接口
【发布时间】:2012-08-27 23:52:48
【问题描述】:

更新:

这个问题不是家庭作业。而且明显不防水... 我想讨论一下内部代表。 当然:add1000 应该加 1000。

**请本着这个问题的精神回答......制作这个防水会使这个问题无缘无故地变长...... ** 您可以击败纯十进制表示 Changing internal representation in runtime 更新 2:见

创建一个实现这个接口的类型:

interface INumber
    {
        void add1000();
        void SetValue(decimal d);
        decimal GetValue();         
    }

以便我在这个 for 循环中尽可能快地从 0 到 100 亿(美国十亿,所以直到 10e9)迭代:

private static void DoSomeAdding(INumber n)
        {
            Debug.Assert(n.GetValue()==0);

            for (long i=0; i<10000000000; i += 1000)
            {
                n.add1000();
            }

            Debug.Assert(n.GetValue() == 10000000000);

        }

所以你可以称它为:

DoSomeAdding(new YourNumberClass());

【问题讨论】:

  • 可能是懒加载的一种做法。
  • 我还是不明白这个问题是关于什么的。
  • 问题是:你将如何实现内部表示?
  • 你能定义最快吗?我们是在谈论运行时、内存使用、可读性、代码行数……吗?
  • 运行时......................(该死的 15 个字符)

标签: c#


【解决方案1】:
public Cheating : INumber
{
    static int timesCalled = 0;

    public void add1000() {}
    public void SetValue(decimal d) {}

    public decimal GetValue()
    {
        if (timesCalled == 0)
        {
            timesCalled += 1;
            return 0;
        }

        return 1000000000;
    }
}

【讨论】:

  • 我想有人可能会争辩说这不是作弊,而只是测试驱动设计的一种早期解决方案,它通过了一个且唯一的接口测试。
【解决方案2】:

像 Anton 的解决方案,但更小心 :) 哦,我已将名称更改为更像 .NET。

public Number : INumber
{
    private decimal value = 0m;
    private int thousands = 0;

    public void Add1000()
    {
        thousands++;
    }

    void SetValue(decimal d)
    {
        value = d;
        thousands = 0;
    }

    decimal GetValue()
    {
        // Careful of the overflow... (do multiplication in decimal)
        value += thousands * 1000m;
        thousands = 0;
        return value;
    }
}

【讨论】:

  • 我已经阅读了 Skeet 的事实,所以如果你的解决方案不能胜过我的,我会调整我的秒表课程
  • +1 8(但在这种情况下混合表示仍然会快一点)
  • 事实上,有可能有一种非常快速的方法可以通过使用一定的技巧将千位整数转换为小数......但我可能会坚持使用这段代码。
【解决方案3】:
public class JNumber : INumber
{
    decimal num = 0;

    public void add1000()
    {
        num = 10000000000;
    }

    public void SetValue(decimal d)
    {
    }

    decimal GetValue()
    {
        return num;
    }
}

...作弊,但通过了。

【讨论】:

    【解决方案4】:

    我认为您需要更多要求。正如所写,最快的解决方案是这样的:

    class MyNumberClass {
       bool is_ten_billion = false;
       int GetValue() {
          if(is_ten_billion) return 10000000000;
          is_ten_billion = true;
          return 0;
       }
    
       decimal add1000() {}
    
       void setValue(decimal d) {}
    }
    

    这样优化器可以处理对 add1000() 的调用,然后完全处理循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 2012-02-01
      相关资源
      最近更新 更多