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