Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C谜语:实现接口_C# - Fatal编程技术网

C# C谜语:实现接口

C# C谜语:实现接口,c#,C#,更新: 这个问题不是家庭作业。而且表面上不防水。。。 我想讨论一下内部代表性。 当然:add1000应该加1000 **请本着这个问题的精神回答。。。使其防水将使这个问题无缘无故地变得更长..** 你可以打败纯粹的十进制表示法 更新2:见 创建实现此接口的类型: interface INumber { void add1000(); void SetValue(decimal d); decimal GetValue();

更新:

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

**请本着这个问题的精神回答。。。使其防水将使这个问题无缘无故地变得更长..** 你可以打败纯粹的十进制表示法 更新2:见

创建实现此接口的类型:

interface INumber
    {
        void add1000();
        void SetValue(decimal d);
        decimal GetValue();         
    }
所以我以尽可能快的速度迭代,从0到100亿美元,直到这个for循环中的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);

        }

…作弊,但是及格。

我认为你需要更多的要求。如前所述,最快的解决方案如下:

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的调用,然后处理整个循环。

就像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;
    }
}

我想有人可能会说,这不是作弊,而只是测试驱动设计的早期解决方案,该设计通过了接口的唯一测试。这可能是延迟加载的一种实践。我仍然不知道问题是什么。问题是:如何实现内部表示?能否定义最快的?我们是在谈论运行时、内存使用、可读性、代码行吗?运行时。。。。。。。。。。。。。。。。。。。。。。。。。。该死的15个字符我已经读过双向飞碟的事实,所以如果你的解决方案没有超过我的+18,我会调整我的秒表类,但在这种情况下,混合表示仍然有点快。事实上,有可能有一种非常快的方法,通过使用一定数量的狡猾,将整数数千转换成小数。。。但我可能会坚持这条代码。
public class JNumber : INumber
{
    decimal num = 0;

    public void add1000()
    {
        num = 10000000000;
    }

    public void SetValue(decimal d)
    {
    }

    decimal GetValue()
    {
        return num;
    }
}
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) {}
}
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;
    }
}