liangbch 发表于 2009-3-13 10:08:07

我把ACM1000想复杂了,随便写了一个,轻易通过。

litaoye 发表于 2009-3-13 13:54:35

原帖由 liangbch 于 2009-3-13 09:52 发表 http://bbs.emath.ac.cn/images/common/back.gif
我的一朋友问我一个问题,A+B 怎么回事?见http://acm.timus.ru/problem.aspx?space=1&num=1000
楼主应该是做过A+B的,这个问题中,既没有给出两个数的类型(整数,浮点数),有没有给出数的范围,你能告诉做这个 ...

呵呵,是最简单的int32加法,属于让你熟悉一下ACM环境!

我被那道题弄晕了,昨晚上好不容易修改了一个自己觉得满意的方法,本地测试要比以前的快,没想到放上去一跑,第3个测试就超时了!

搞不清怎么回事儿了!

litaoye 发表于 2009-3-13 14:01:00

我用c#做的排序,10000条大概13毫秒吧!

昨天统计了一下,测试的是1-10000,本应当计算50000000次的,经过优化后,需要算17000000,大概是1/3吧!

看来优化效果不是很明显!

原帖由 无心人 于 2009-3-13 10:04 发表 http://bbs.emath.ac.cn/images/common/back.gif
宝宝,
   用跳转表写
   应该能消除大部分跳转指令

无心人 发表于 2009-3-13 14:41:58

你有测试文本么?

懒得用随机数自己生成

哈哈

无心人 发表于 2009-3-13 14:49:28

现在要两个表
1、是2进制最高位与log_10的值对照表
2、是1表在某些值上需要比较大小的值的表

无心人 发表于 2009-3-13 14:53:16

bsr可以这么用
   struct int128
   {
      DWORD u;
   }

   __declspec(naked)
    DWORD __fastcall log2(DWORD n)
    {
      __asm
       {
      bsreax, ecx
      ret
      }
    }

    DWORD inline log2_128(int128 n)
    {
      return (n.u != 0? log2(n.u) + 96 : (n.u != 0 ? log2(n.u) + 64 : (n.u != 0 ? log2(n.u)+ 32: log2(n.u))))
    }

litaoye 发表于 2009-3-13 14:54:45

原帖由 无心人 于 2009-3-13 14:41 发表 http://bbs.emath.ac.cn/images/common/back.gif
你有测试文本么?

懒得用随机数自己生成

哈哈
也是随机生成的!

litaoye 发表于 2009-3-13 15:05:47

原帖由 litaoye 于 2009-3-13 14:54 发表 http://bbs.emath.ac.cn/images/common/back.gif

也是随机生成的!

说实话,用这个随机生成的测我现在的程序,那真是跑的刷刷的,5000万次几乎只要算30-50万次就可以了!

不过如果数据大量重复的话,会比较慢!

无心人 发表于 2009-3-13 15:24:37

好, 谢谢了

我有时间我写个看看

litaoye 发表于 2009-3-13 15:26:39

似乎就是重复数据的问题,又针对这点修改了一下程序,test#3果然就通过了,而且还挺快的.
页: 1 2 3 4 5 6 [7] 8 9 10 11 12 13 14 15 16
查看完整版本: 关于一个运算优化的问题