本帖最后由 snoop_lttx 于 2012-08-20 19:45:02 编辑

解决方案 »

  1.   

    让我们先看看正解:http://www.wolframalpha.com/input/?i=34+%5E+103+mod+143
    答案是122。
    两种运算,只是精度有别,最终结果都是错误的。
      

  2.   

    取模运算没什么精度的问题,只有对或不对Math.Pow进行的浮点数运算,区模进行的是整数运算
    Pow的结果会被转换为int,问题是早就溢出了。所以你的结果肯定不对如果你真有这种需求,可以自己写个这样的函数进行精确计算[code=C#]        public int ModAfterPow(int b, int e, int m)
            {
                int t = 1;
                for (int i = 0; i < e; i++) {
                    t = t * b;
                    t = t % m;
                }            return t;
            }        public override void Run()
            {
                Console.WriteLine(ModAfterPow(34, 103, 143));
            }
    [code]
      

  3.   

    取模确实不存在精度问题,精度问题是Math.Pow造成的。
    但.Net的取模并不是只针对整数的,浮点数一样可以取模并获得正确的结果。所以Math.Pow(34,103) % 143是会将143转为double进行运算而不是你说的将pow结果转换为int。
      

  4.   

    就像中学数学里面为了讲解多项式而故意编一个今天是星期一,问2^xxxx次方后的那天是星期几。而这个时间早就超过了宇宙的寿命的尺度,算出来也是毫无意义的一样。
      

  5.   


    嗯,结果我贴错了,122就是正确结果,精度之间确实存在问题,double的精度不够,舍去了太多的精度。
      

  6.   

    嗯,正解是122,我打错了,double的精度确实不够,舍掉了太多的精度,不过正解是没有问题的。
      

  7.   

    因为求幂是浮点运算,得到的结果是不精确的,虽然double的相对误差很小,但是绝对误差已经是亿亿亿亿亿亿了
    而取模是整数运算不会有半点的误差。你觉得对一个有亿亿亿亿亿亿误差的数取模会有任何意义吗?