예제 #1
0
        /// <summary>
        /// This method add the two values given by user (this, other)
        /// </summary>
        /// <param name="other">Second value to Add</param>
        /// <returns>Add object</returns>
        public override Number Calculate(Number num1, Number num2)
        {
            char[] a    = num1.GetNumber(num1).ToCharArray();
            char[] b    = num2.GetNumber(num2).ToCharArray();
            bool   flag = false;
            int    len  = a.Length > b.Length ? a.Length : b.Length; // maximum length

            if (num2 is null || this is null || a.Length == 0 || b.Length == 0)
            {
                num2.AssignInputValue("");
                return(num2);
            }

            if ((num1.GetNumber(num1) == num2.GetNumber(num2)) && (num1.GetSign(num1) || num2.GetSign(num2)))
            {
                num2.AssignInputValue("0", false);
                return(num2);
            }

            string result = "";
            int    s      = 0;

            int i = a.Length - 1, j = b.Length - 1;

            while (i >= 0 || j >= 0 || s == 1)
            {
                s     += ((i >= 0) ? a[i] - '0' : 0);
                s     += ((j >= 0) ? b[j] - '0' : 0);
                result = (char)(s % 2 + '0') + result;

                s /= 2;
                i--; j--;
            }
            //this is for when both are signed
            if (num1.GetSign(num1) && num2.GetSign(num2))
            {
                num2.AssignInputValue(result, true);
                return(num2);
            }

            //To know which number is greater
            if (b.Length > a.Length)
            {
                flag = true;
            }
            else if (b.Length == a.Length)
            {
                for (int x = 0; x < a.Length; x++)
                {
                    if (a[x] < b[x])
                    {
                        flag = true;
                        break;
                    }
                    else
                    {
                        flag = false;
                        break;
                    }
                }
            }
            else
            {
                flag = false;
            }

            //this is for when one is signed and the other isn't.
            if ((num1.GetSign(num1) && !num2.GetSign(num2)) || (!num1.GetSign(num1) && num2.GetSign(num2)))
            {
                Number    c1  = new Binary(num1.GetNumber(num1));
                Number    c2  = new Binary(num2.GetNumber(num2));
                Operation sp  = new SubOperation();
                Number    res = sp.Calculate(c1, c2);

                if (flag)
                {
                    if (num1.GetSign(num1) && !num2.GetSign(num2))
                    {
                        return(new Binary(res.GetNumber(res), false));
                    }
                    else
                    {
                        return(new Binary(res.GetNumber(res), true));
                    }
                }
                else
                {
                    if (!num1.GetSign(num1) && num2.GetSign(num2))
                    {
                        return(res);
                    }
                    else
                    {
                        return(new Binary(res.GetNumber(res), true));
                    }
                }
            }
            if (!num1.GetSign(num1) && num2.GetSign(num2))
            {
                Number    c1  = new Binary(num1.GetNumber(num1));
                Number    c2  = new Binary(num2.GetNumber(num2));
                Operation sp  = new SubOperation();
                Number    res = sp.Calculate(c1, c2);
                return(res);
            }
            string p = new string(result);

            num2.AssignInputValue(p);
            return(num2);
        }
        /// <summary>
        /// This method divides the two values given by user (this, other)
        /// </summary>
        /// <param name="other">Second value to divide</param>
        /// <returns>Divide object</returns>
        public override Number Calculate(Number num1, Number num2)
        {
            char[] a = num1.GetNumber(num1).ToCharArray();
            char[] b = num2.GetNumber(num2).ToCharArray();
            bool   flag1 = true, flag2 = true;
            int    t = 0, countZeros = 0;

            //Null object or empty array checking
            if (num2 is null || this is null || a.Length == 0 || b.Length == 0)
            {
                throw new ArgumentNullException();

                /*num2.AssignInputValue("");
                 * return num2;*/
            }

            //Can't divide by zero
            for (int z = 0; z < b.Length; z++)
            {
                if (b[z] == '0')
                {
                    countZeros++;
                }
            }
            if (countZeros == b.Length)
            {
                throw new DivideByZeroException();
            }

            //Example for 2/7, return 0
            if (a.Length < b.Length)
            {
                Console.Write("0");
                return(new Binary("0"));
            }
            else
            {
                if (a.Length == b.Length)
                {
                    for (int i = 0; i < a.Length; i++)
                    {
                        if (a[i] < b[i])
                        {
                            flag1 = false;
                            break;
                        }
                    }
                }
                //E.g, 5/7, return 0
                if (!flag1)
                {
                    Console.Write("0");
                    return(new Binary("0"));
                }
                char[] c = new char[a.Length];

                string q1_first = "0", q = "";

                //if a.length > b.length e.g., a= 1010101 b = 100, then create new array and add zeros in the beginning.
                if (a.Length > b.Length)
                {
                    for (int i = 0; i < a.Length - b.Length; i++)
                    {
                        c[i] = '0';
                    }
                    for (int i = a.Length - b.Length; i < a.Length; i++)
                    {
                        c[i] = b[t];
                        t++;
                    }
                }
                else
                {
                    for (int i = 0; i < b.Length; i++)
                    {
                        c[i] = b[i];
                    }
                }

                string s1 = new string(a);
                string s2 = new string(c);

                while (flag2)
                {
                    Number    n1  = new Binary(s1);
                    Number    n2  = new Binary(s2);
                    Operation op  = new SubOperation();
                    Number    rem = op.Calculate(n1, n2);
                    s1 = rem.GetNumber(rem);
                    Number    q1   = new Binary(q1_first);
                    Number    q2   = new Binary("1");
                    Operation op1  = new AddOperation();
                    Number    quot = op1.Calculate(q1, q2);
                    q1_first = quot.GetNumber(quot);

                    char[] p1 = rem.GetNumber(rem).ToCharArray();
                    char[] p2 = s2.ToCharArray();

                    //check if num1 is greater than num2
                    for (int i = 0; i < a.Length; i++)
                    {
                        if (p1[i] > p2[i])
                        {
                            flag2 = true;
                            break;
                        }
                        else if (p1[i] < p2[i])
                        {
                            flag2 = false;
                            break;
                        }
                    }
                    q = quot.GetNumber(quot);
                }
                Console.Write(q);

                if (((!num1.GetSign(num1) && !num2.GetSign(num2)) || (num1.GetSign(num1) && num2.GetSign(num2))) || (q == "0"))
                {
                    return(new Binary(q));
                }
                else
                {
                    return(new Binary(q, true));
                }
            }
        }