找回密码
 立即注册

QQ登录

只需一步,快速开始

Leo

超级版主

20

主题

493

帖子

1073

积分

超级版主

Rank: 8Rank: 8

积分
1073

活字格认证微信认证勋章元老葡萄

Leo
超级版主   /  发表于:2014-5-13 14:04  /   查看:6017  /  回复:3
  1.         /// <summary>
  2.         /// Cuberoot运算
  3.         /// </summary>
  4.         /// <param name="a">输入参数List,正确输入时仅含一个数据</param>
  5.         /// <returns>返回运算结果</returns>
  6.         public static BigDecimal Cuberoot(List<BigDecimal> a)
  7.         {
  8.             if (a.Count() != 1)
  9.             {
  10.                 throw new Exception("cuberoot函数输入错误");
  11.             }
  12.             else
  13.             {
  14.                 BigDecimal Num = BigDecimal.Simplify(a.First());

  15.                 //若Num的整数部分为零,则直接返回它本身
  16.                 if (Num.GetIntPart() == 0)
  17.                 {
  18.                     return Num;
  19.                 }
  20.                 else
  21.                 {
  22.                     //使用迭代法求立方根
  23.                     //定义常数3
  24.                     BigDecimal Three = new BigDecimal(3);

  25.                     //定义计算结果和开立方数Y
  26.                     BigDecimal Result = new BigDecimal(0);
  27.                     BigDecimal Y = new BigDecimal(Num);

  28.                     //先对阶数化简
  29.                     Result.SetOrder(Y.GetOrder() / 3);
  30.                     Y.SetOrder(Y.GetOrder() % 3);

  31.                     BigDecimal CalculateEps = new BigDecimal("1e" + ((BigInteger.Abs(Y.GetIntPart()).ToString().Length + Y.GetOrder()) / 3 - BigDecimal.Accuracy).ToString());

  32.                     //先限制乘法有效位数
  33.                     BigDecimal.LimitMultiply = true;

  34.                     //开始计算
  35.                     BigDecimal X = new BigDecimal(1);
  36.                     BigDecimal NewX = (X + X + Y / (X * X)) / Three;

  37.                     while (BigDecimal.Abs((NewX - X)) > CalculateEps)
  38.                     {
  39.                         X = NewX;
  40.                         NewX = (X + X + Y / (X * X)) / Three;
  41.                     }

  42.                     Result.SetIntPart(NewX.GetIntPart());
  43.                     Result.SetOrder(Result.GetOrder() + NewX.GetOrder());
  44.                     Result = BigDecimal.Simplify(Result);

  45.                     //关闭限制乘法有效位数
  46.                     BigDecimal.LimitMultiply = false;

  47.                     return Result;
  48.                 }
  49.             }
  50.         }
复制代码

以上,欢迎讨论。

3 个回复

倒序浏览
daodao
论坛元老   /  发表于:2014-5-13 15:51:00
沙发
哎呀~这是我的代码……:#
回复 使用道具 举报
Leo
超级版主   /  发表于:2014-5-13 16:32:00
板凳
回复 2楼daodao的帖子

嘿嘿,不小心被你发现了。
回复 使用道具 举报
Leo
超级版主   /  发表于:2014-5-15 08:57:00
地板
好了,点评一下。
优点:
对参数做了必要的检查,代码条理还算清晰,
缺点:
圈复杂度还是有一点点的高,可以适当化简,提高代码可读性。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部