回复 90# liangbch 的帖子
肯定会慢不少,尤其是运算量较大的时候。所以我的目标就是超过前面的JAVA就行了!呵呵!(我C++的水平不行,所以干啥都用c#)
如果我的程序能比以前有较大的提高的话,相信转化为C++的会更快! 终于找到BUG了!都快疯了!主要是一般数据测试起来全是正确的,可偏偏Test 10#过不去!
程序一长了,就不容易找错了!
(快300行了,其中有个120多行的大数类,再加上求10的0-38次方,也有20-30行)
现在用C#的成绩是0.312!
liangbch同志,不好意思了,昨天第1次提交成功的时候0.326,正好是第42,呵呵!
这下JAVA们再也赶不上了!很有成就感...... 汗, 你没事用大数类做什么啊????
好像用不到诶 原帖由 无心人 于 2009-3-14 13:45 发表 http://bbs.emath.ac.cn/images/common/back.gif
汗, 你没事用大数类做什么啊????
好像用不到诶
我自己写的挺简单的,就是包括XOR, 比较大小,付初始值,加法和乘法。
又想了一下,现在的算法还有可以优化的地方,晚上再试试! 这个似乎
1、排序, 基数排序就可以了,用16位为单位
2、确定每个数的最高位
3、如果m不和某个10^n的最高位相等
只要计算最高位等于m的最高位的n的logXOR(m, n)
4,如果和某个10^n的最高位相等,需要计算小于该数的全部logXOR, gxq的算法可以参考
好像目前就只能这么优化了 好像用不到加法乘法诶 原帖由 无心人 于 2009-3-14 15:46 发表 http://bbs.emath.ac.cn/images/common/back.gif
好像用不到加法乘法诶
算10的幂的时候用了个乘法,其实可以先算出来直接保存的,可能还快一点,不过觉得挺麻烦的,加法是当时觉得有用就写了,现在也没有用上 我下载了宝宝的代码
打算在里面加排序
哈哈
用宝宝的代码修改提交后打败宝宝
回复 98# 无心人 的帖子
等我的程序优化完了,也贴上来,看有没有什么用! 将求128bit的常用对数程序,完全用汇编写了,速度却没有改进多少。从0.343改进到0.328.仔细查看了编译后的 logSum 函数(见下),发现指令数很多,遂重写循环,速度一下子就提到了0.171。
代码改进前的速度0.328int logSum( UINT128 *data,int count)
{
int i,j;
UINT128 t;
DWORD r;
for (r=0,i=0;i<count;i++)
{
for (j=i+1;j<count;j++)
{
t=data;
t.U ^=data.U;
t.U ^=data.U;
t.U ^=data.U;
t.U ^=data.U;
r += log10(&t);
}
}
return r*2;
}代码改进后的速度0.171int logSum( UINT128 *data,int count)
{
DWORD r;
UINT128 t;
UINT128 *p1,*p2,*pEnd;
p1=data;
pEnd=(data+count-1);
r=0;
for (;p1<=pEnd;p1++)
{
for (p2=p1+1;p2<=pEnd;p2++)
{
t.U = p1->U ^ p2->U;
t.U = p1->U ^ p2->U;
t.U = p1->U ^ p2->U;
t.U = p1->U ^ p2->U;
r += log10(&t);
}
}
return r*2;
}看来计算log10所占的比重很小,速度很难提高了,下面是我的log 10函数的原型__declspec(naked)
DWORD __fastcall log10( UINT128 *n)
{
__asm
{
push ecx
push esi
mov esi,ecx
......by the way, 楼主用C# 做到0.312,确实不易。