我也做“双倍立方数”
-----------最后更新---------
经过修改代码,最后算出来的结果终于是对的。。。
跟http://www.cnblogs.com/yujiasw/archive/2009/06/05/1497161.html比较了一下,这次再也没有出现在某个值左右比他的算法慢的情况了
1999999999:
他:313ms
我:183ms
一、具体算法就不解释了,太简单了,我都不好意思解释了。。。
二、计时用的是http://www.cnblogs.com/eaglet/archive/2009/03/10/1407791.html
三、其实后来仔细一想,虽然代码是自己写的,但是事实上的思想是差不多的,只不过我去除了一些无谓的循环而已,而且对字典的初始容量做了一定的限制,减小了新分配空间的时间消费而已
教训:
一、看题一定要看清楚
二、看清楚了心里的意识也一定要清楚 ,意识错了,算法必错
三、切莫沾沾自喜,不然要遭雷劈的,刚才就被雷劈了一下
四、晚上回家面壁三分钟,好好反省一下自己
五、最后再厚颜无耻、死皮不要脸的上一下首页
代码:
static void TestDoubleCubeNumber(long n)
{
//第一个数,也就是a的取值范围,因为:0 < a <= b
int FirstMaxValue = (int)Math.Pow((double)n / 2, 1.0 / 3) + 1;
//第二个数,也就是b的最大可能取值
int MaxValue = (int)Math.Pow(n, 1.0 / 3) + 1;
//存放计算得出的立方数的数组
int[] cube = new int[MaxValue + 1];
int tempValue = 1;
int index = 1;
while (index <= MaxValue)
{
cube[index++] = tempValue * tempValue * tempValue;
tempValue++;
}
Dictionary<int, int> dli = new Dictionary<int, int>((int)(FirstMaxValue * FirstMaxValue * 0.7));//这里得出的0.7是根据几次结果的综合后算出的大致容量
for (int i = 1; i <= FirstMaxValue; i++)
{
int otherValue = i;
while (otherValue <= MaxValue)
{
int result = cube[i] + cube[otherValue++];
if (result > n)
break;
if (dli.ContainsKey(result))
continue;
dli.Add(result, i);
}
}
Console.WriteLine(FirstMaxValue);
Console.WriteLine(MaxValue);
Console.WriteLine(dli.Count);
}
唉,太马虎了,题目没有看清就。。。算了,鄙视自己一下
-----------第二次更新---------
当你沾沾自喜的时候,说明你已经出问题了
刚写完代码的时候还在沾沾自喜,以为自己做的很nb
经过严格的对比之后,发现自己做错了,算法有严重漏洞
先回收一下
-----------第一次更新---------
随手写了一个,跟
http://www.cnblogs.com/yujiasw/archive/2009/06/05/1497161.html
这个兄弟的做了一下比较,很奇怪的结果
475574:
他:2ms
我:12ms
1999999999:
他:318ms
我:168ms
后来又测试了一下,分水线基本上是在2亿左右,小于这个值,他的速度快,大于这个值,我的速度快,这是为什么啊?
没有再测试其他的了,就简单的测试了一下这两个值,看来我的代码在值比较小的时候不占优势啊,伤心了
一、具体算法就不解释了,太简单了,我都不好意思解释了。。。
二、计时用的是http://www.cnblogs.com/eaglet/archive/2009/03/10/1407791.html
三、没仔细检查代码,若有错误请指出
代码:
static void TestDoubleCubeNumber(long n)
{
int temp = (int)Math.Pow((double)n / 2, 1.0 / 3);
Dictionary<int, long> dil = new Dictionary<int, long>(temp);
for (int i = 1; i < temp + 2; i++)
{
int t = i;
dil.Add(t, t * t * t);
}
Dictionary<long, int> dli = new Dictionary<long, int>(temp * 500);
for (int i = 1; i < temp + 2; i++)
{
for (int j = i; j < temp + 2; j++)
{
long result = dil[i] + dil[j];
if (result <= n)
{
if (!dli.ContainsKey(result))
{
dli.Add(result, i);
}
}
}
}
Console.WriteLine(dil.Count);
Console.WriteLine(dli.Count);
}
PS:看见别人粘贴进来的代码都是放在一个框里面,那个怎么做啊?我好像找不到选项,太笨了,唉。。。