Esempio n. 1
0
 /// <summary>
 /// 求两个数的最小公倍数。如果其中有个数为0,则返回0
 /// </summary>
 /// <param name="a"></param>
 /// <param name="b"></param>
 /// <returns></returns>
 public static NaturalNumStr LeastCommonMultiple(NaturalNumStr a, NaturalNumStr b)
 {
     if (a == null || b == null)
     {
         throw new ProgramInterruptException(ProgramInterruptExceptionType.IllegalValue);
     }
     //统一计算空间
     if (a.Space != b.Space)
     {
         if (a.Space == OperationSpace.DefaultSpace)
         {
             a = (NaturalNumStr)a.ChangeOperationSpace(b.Space);
         }
         else if (b.Space == OperationSpace.DefaultSpace)
         {
             b = (NaturalNumStr)b.ChangeOperationSpace(a.Space);
         }
         else
         {
             throw new ProgramInterruptException(ProgramInterruptExceptionType.NotSameOperationSpace);
         }
     }
     if (a == 0 || b == 0)
     {
         return(new NaturalNumStr(0, a.Space));
     }
     return(a * b / GreatestCommonDivisor(a, b));
 }
Esempio n. 2
0
        /// <summary>
        /// 求两个数的最大公约数。如果其中一个数为0、另一个不为0,则返回不为0的那个数
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <returns></returns>
        public static NaturalNumStr GreatestCommonDivisor(NaturalNumStr a, NaturalNumStr b)
        {
            if (a == null || b == null)
            {
                throw new ProgramInterruptException(ProgramInterruptExceptionType.IllegalValue);
            }
            var old_a = a;
            var old_b = b;

            //统一计算空间
            if (a.Space != b.Space)
            {
                if (a.Space == OperationSpace.DefaultSpace)
                {
                    a = (NaturalNumStr)a.ChangeOperationSpace(b.Space);
                }
                else if (b.Space == OperationSpace.DefaultSpace)
                {
                    b = (NaturalNumStr)b.ChangeOperationSpace(a.Space);
                }
                else
                {
                    throw new ProgramInterruptException(ProgramInterruptExceptionType.NotSameOperationSpace);
                }
            }
            if (a == 0)
            {
                if (b == 0)
                {
                    throw new IllegalOperationException();
                }
                else
                {
                    if (ReferenceEquals(b, old_b))
                    {
                        return(new NaturalNumStr(b));
                    }
                    else
                    {
                        return(b);
                    }
                }
            }
            else if (b == 0)
            {
                if (ReferenceEquals(a, old_a))
                {
                    return(new NaturalNumStr(a));
                }
                else
                {
                    return(a);
                }
            }
            if (b > a)
            {
                var t = a;
                a = b;
                b = t;
            }
            //辗转相除法
            while (!b.IsZero)
            {
                var t = a;
                a = b;
                b = t % b;
            }
            if (ReferenceEquals(a, old_a) || ReferenceEquals(a, old_b))
            {
                return(new NaturalNumStr(a));
            }
            else
            {
                return(a);
            }
        }