예제 #1
0
        public static LongArifmetik Parse(string x)
        {
            var temp = new LongArifmetik(x.Length);

            temp.num = x.ToCharArray();
            Array.Reverse(temp.num);
            return(temp);
        }
예제 #2
0
        public static LongArifmetik operator -(LongArifmetik a, int bb)
        {
            LongArifmetik b = new LongArifmetik(bb.ToString());

            if (b.num.Length > a.num.Length)
            {
                Console.WriteLine("Вычитаемое больше уменьшаемого, что не допустимо.");
                return(null);
            }
            if (b.num.Length < a.num.Length)
            {
                for (int i = b.num.Length; i < a.num.Length; i++)
                {
                    Array.Resize(ref b.num, b.num.Length + 1);
                    b.num[i] = '0';
                }
            }


            for (int i = a.num.Length - 1; i >= 0; i--)
            {
                bool flag = false;
                if (a.num[i] > b.num[i])
                {
                    break;
                }
                if (a.num[i] < b.num[i])
                {
                    flag = true;
                    Console.WriteLine("Вычитаемое больше уменьшаемого, что не допустимо.");
                }

                if (flag == true)
                {
                    return(null);
                }
            }
            LongArifmetik c = new LongArifmetik(a.num.Length);
            int           s = 0;

            for (int i = 0; i < a.num.Length; i++)
            {
                int temp = (int)Char.GetNumericValue(a.num[i]) - (int)Char.GetNumericValue(b.num[i]) + s;
                s = (int)Math.Round(temp / 10.0, MidpointRounding.ToNegativeInfinity);
                if (temp < 0)
                {
                    temp += 10;
                }
                c.num[i] = Char.Parse(Convert.ToString(temp));
            }
            return(c);
        }
예제 #3
0
 static public void print(LongArifmetik a)
 {
     if (a == null)
     {
         Console.WriteLine("Произошла ошибка");
         return;
     }
     for (int i = a.num.Length - 1; i >= 0; i--)
     {
         Console.Write(a.num[i]);
     }
     Console.WriteLine();
 }
예제 #4
0
        public static void StatisticPower(LongArifmetik a, LongArifmetik b)
        {
            var           stw = new Stopwatch();
            LongArifmetik c;

            stw.Start();
            for (int i = 0; i < 1000; i++)
            {
                c = LongArifmetik.FastPow(a, b);
            }
            stw.Stop();
            Console.WriteLine("Время возведения в степень: " + stw.ElapsedMilliseconds / 1000.0);
        }
예제 #5
0
        public static void Statistic(LongArifmetik a, LongArifmetik b)
        {
            var           stw = new Stopwatch();
            LongArifmetik c;

            stw.Start();
            for (int i = 0; i < 1000; i++)
            {
                c = a + b;
            }
            stw.Stop();
            Console.WriteLine("Время выполнения сложения: " + stw.ElapsedMilliseconds / 1000.0);
            stw.Restart();
            for (int i = 0; i < 1000; i++)
            {
                c = a - b;
                if (c == null)
                {
                    break;
                }
            }
            stw.Stop();
            Console.WriteLine("Время выполнения вычитания: " + stw.ElapsedMilliseconds / 1000.0);
            stw.Restart();
            for (int i = 0; i < 1000; i++)
            {
                c = a * b;
            }
            stw.Stop();
            Console.WriteLine("Время выполнения умножения: " + stw.ElapsedMilliseconds / 1000.0);
            stw.Restart();
            for (int i = 0; i < 1000; i++)
            {
                c = a / b;
                if (c == null)
                {
                    break;
                }
            }
            stw.Stop();
            Console.WriteLine("Время выполнения деления: " + stw.ElapsedMilliseconds / 1000.0);
        }
예제 #6
0
        public static LongArifmetik operator *(LongArifmetik a, int b)
        {
            LongArifmetik b_ = new LongArifmetik(b.ToString());

            if (b_.num.Length > a.num.Length)
            {
                char[] temp = a.num;
                a.num  = b_.num;
                b_.num = temp;
            }
            var c = new LongArifmetik(2 * a.num.Length);

            //char[] c = new char[a.num.Length];
            for (int i = 0; i < a.num.Length; i++)
            {
                c.num[i] = '0';
            }
            for (int i = 0; i < a.num.Length; i++)
            {
                int s = 0;
                for (int j = 0; j < b_.num.Length; j++)
                {
                    int t = 0;
                    t            = (int)Char.GetNumericValue(c.num[i + j]) + (int)Char.GetNumericValue(a.num[i]) * (int)Char.GetNumericValue(b_.num[j]) + s;
                    c.num[i + j] = Char.Parse(Convert.ToString(t % 10));
                    s            = t / 10;
                }
                c.num[i + b_.num.Length] = Char.Parse(Convert.ToString(s));
            }
            for (int i = c.num.Length - 1; i >= 0; i--)
            {
                if (c.num[i] == '\0')
                {
                    Array.Resize(ref c.num, c.num.Length - 1);
                }
                else
                {
                    break;
                }
            }
            return(c);
        }
예제 #7
0
        public static LongArifmetik FastPow(LongArifmetik a, LongArifmetik n)
        {
            var result = new LongArifmetik("1");

            while (n > 0)
            {
                var tempN = n % 2;
                if (tempN.num[0] == '0')
                {
                    a = a * a;
                    n = n / 2;
                }
                else
                {
                    result = result * a;
                    n      = n - 1;
                }
            }
            return(result);
        }
예제 #8
0
        public static LongArifmetik operator %(LongArifmetik a, LongArifmetik b)
        {
            if (b.num.Length == 0)
            {
                Console.WriteLine("Делитель не введен.");
                return(null);
            }
            bool errorFlag = true;

            for (int i = 0; i < b.num.Length; i++)
            {
                if (b.num[i] != '0')
                {
                    errorFlag = false;
                    break;
                }
            }
            if (errorFlag == true)
            {
                Console.WriteLine("На ноль делить нельзя.");
                return(null);
            }

            //if (b > a)
            //{
            //    Console.WriteLine("Делитель больше делимого. Ответ 0.");
            //    var e = new LongArifmetik("0");
            //    return e;
            //}

            var tempA = new LongArifmetik(0);

            var q = new LongArifmetik(0);

            for (int i = a.num.Length - 1; i >= 0; i--)
            {
                int divisor = 0;
                tempA.PushBack(a.num[i]);

                if (!(tempA > 0))
                {
                    q.PushBack('0');
                    continue;
                }
                if (tempA < b && q.num.Length != 0)
                {
                    q.PushBack('0');
                    continue;
                }
                if (tempA < b)
                {
                    continue;
                }
                while (!(tempA < b))
                {
                    tempA = tempA - b;
                    divisor++;
                }
                q.PushBack(Convert.ToChar(divisor.ToString()));
            }

            for (int i = tempA.num.Length - 1; i > 0; i--)
            {
                if (tempA.num[i] == '\0' || tempA.num[i] == '0')
                {
                    Array.Resize(ref tempA.num, tempA.num.Length - 1);
                }
                else
                {
                    break;
                }
            }
            return(tempA);
        }
예제 #9
0
        public static LongArifmetik operator *(LongArifmetik a, LongArifmetik b)
        {
            bool perest = false;


            if (b.num.Length > a.num.Length)
            {
                char[] temp = a.num;
                a.num  = b.num;
                b.num  = temp;
                perest = true;
            }
            var c = new LongArifmetik(2 * a.num.Length);

            //char[] c = new char[a.num.Length];
            for (int i = 0; i < a.num.Length; i++)
            {
                c.num[i] = '0';
            }
            for (int i = 0; i < a.num.Length; i++)
            {
                int s = 0;
                for (int j = 0; j < b.num.Length; j++)
                {
                    int t = 0;
                    t            = (int)Char.GetNumericValue(c.num[i + j]) + (int)Char.GetNumericValue(a.num[i]) * (int)Char.GetNumericValue(b.num[j]) + s;
                    c.num[i + j] = Char.Parse(Convert.ToString(t % 10));
                    s            = t / 10;
                }
                c.num[i + b.num.Length] = Char.Parse(Convert.ToString(s));
            }
            for (int i = c.num.Length - 1; i > 0; i--)
            {
                if (c.num[i] == '\0' || c.num[i] == '0')
                {
                    Array.Resize(ref c.num, c.num.Length - 1);
                }
                else
                {
                    break;
                }
            }
            for (int i = a.num.Length - 1; i > 0; i--)
            {
                if (a.num[i] == '\0' || a.num[i] == '0')
                {
                    Array.Resize(ref a.num, a.num.Length - 1);
                }
                else
                {
                    break;
                }
            }
            for (int i = b.num.Length - 1; i > 0; i--)
            {
                if (b.num[i] == '\0' || b.num[i] == '0')
                {
                    Array.Resize(ref b.num, b.num.Length - 1);
                }
                else
                {
                    break;
                }
            }
            if (perest)
            {
                char[] temp = a.num;
                a.num = b.num;
                b.num = temp;
            }
            return(c);
        }
예제 #10
0
        public static LongArifmetik operator +(LongArifmetik a, LongArifmetik b)
        {
            int s = 0;

            if (b.num.Length > a.num.Length)
            {
                for (int i = a.num.Length; i < b.num.Length; i++)
                {
                    Array.Resize(ref a.num, a.num.Length + 1);
                    a.num[i] = '0';
                }
            }
            else
            {
                for (int i = b.num.Length; i < a.num.Length; i++)
                {
                    Array.Resize(ref b.num, b.num.Length + 1);
                    b.num[i] = '0';
                }
            }
            LongArifmetik c = new LongArifmetik(a.num.Length);

            for (int i = 0; i < a.num.Length; i++)
            {
                int temp = (int)Char.GetNumericValue(a.num[i]) + (int)Char.GetNumericValue(b.num[i]) + s;
                s        = temp / 10;
                c.num[i] = Char.Parse(Convert.ToString(temp % 10));
            }
            if (s == 1)
            {
                Array.Resize(ref c.num, c.num.Length + 1);
                c.num[c.num.Length - 1] = Char.Parse(Convert.ToString(s));
            }
            for (int i = a.num.Length - 1; i > 0; i--)
            {
                if (a.num[i] == '\0' || a.num[i] == '0')
                {
                    Array.Resize(ref a.num, a.num.Length - 1);
                }
                else
                {
                    break;
                }
            }
            for (int i = b.num.Length - 1; i > 0; i--)
            {
                if (b.num[i] == '\0' || b.num[i] == '0')
                {
                    Array.Resize(ref b.num, b.num.Length - 1);
                }
                else
                {
                    break;
                }
            }
            for (int i = c.num.Length - 1; i > 0; i--)
            {
                if (c.num[i] == '\0' || c.num[i] == '0')
                {
                    Array.Resize(ref c.num, c.num.Length - 1);
                }
                else
                {
                    break;
                }
            }
            return(c);
        }
예제 #11
0
파일: Program.cs 프로젝트: MaILW/Lesson_4-
        static void Main(string[] args)
        {
            //LongArifmetik f, d;
            LongArifmetik first = null, second = null;

            do
            {
                Console.Write("Выберите откуда будут считаны числа:\n" +
                              "1. Считать из файла.\n" +
                              "2. Считать с клавиатуры.\n" +
                              "Ваш выбор: ");

                string yourChoice;
                while (true)
                {
                    yourChoice = Console.ReadLine();
                    if (yourChoice == "1" || yourChoice == "2")
                    {
                        break;
                    }
                    else
                    {
                        Console.WriteLine("Неправильно сделан выбор. Повторите попытку.");
                    }
                }
                switch (yourChoice)
                {
                case "1":
                    Console.Write("В файле должны находиться два числа, каждое с новой строки.Первое число на первой строке.\n" +
                                  "Уккажите адрес файла: ");
                    string FilePath;
                    do
                    {
                        FilePath = @Console.ReadLine();
                        if (!File.Exists(FilePath))
                        {
                            Console.WriteLine("Указанный файл не существует.\nПовторите ввод.");
                        }
                    } while (!File.Exists(FilePath));

                    string x;

                    do
                    {
                        Console.WriteLine("Нажмите Enter для продолжения.");
                        while (Console.ReadKey().Key != ConsoleKey.Enter)
                        {
                            ;
                        }
                        var reader = new StreamReader(FilePath);
                        x = reader.ReadLine();

                        if (CorrectEntry(x))
                        {
                            first = LongArifmetik.Parse(x);
                        }
                        else
                        {
                            Console.WriteLine("Некорекктный ввод числа.");
                            reader.Dispose();
                            reader.Close();
                            continue;
                        }



                        x = reader.ReadLine();
                        if (CorrectEntry(x))
                        {
                            second = LongArifmetik.Parse(x);
                        }
                        else
                        {
                            Console.WriteLine("Исправьте числа в файле.");
                        }
                        reader.Dispose();
                        reader.Close();
                    } while (!CorrectEntry(x));
                    break;

                case "2":



                    do
                    {
                        Console.WriteLine("Введите первое число: ");
                        x = Console.ReadLine();
                        if (CorrectEntry(x))
                        {
                            first = LongArifmetik.Parse(x);
                        }
                        else
                        {
                            Console.WriteLine("Некорекктный ввод числа." + " Повторите попытку ввода.");
                        }
                    } while (!CorrectEntry(x));
                    do
                    {
                        Console.WriteLine("Введите второе число: ");
                        x = Console.ReadLine();
                        if (CorrectEntry(x))
                        {
                            second = LongArifmetik.Parse(x);
                        }
                        else
                        {
                            Console.WriteLine("Некоректный ввод числа." + " Повторите попытку ввода.");
                        }
                    } while (!CorrectEntry(x));
                    break;

                default:
                    Console.WriteLine("Неправильно сделан выбор. Повторите попытку.");
                    break;
                }
                LongArifmetik sum = first + second, multi = first * second;
                Console.WriteLine("Результатожения:\n\t" + sum);
                Console.WriteLine("\nРезультат вычитания:\n\t");
                LongArifmetik subtract = first - second;
                Console.WriteLine(subtract);
                Console.WriteLine("\nРезультат умножения:\n\t" + multi);
                Console.WriteLine("\nРезультат деления:\n\t");
                LongArifmetik div = first / second;
                Console.WriteLine(div);


                var writer = new StreamWriter(@"D:\result.txt");
                writer.WriteLine("Результат сложения:\n\t" + sum);
                writer.Write("\nРезультат вычитания:\n\t");
                writer.WriteLine(subtract);
                writer.WriteLine("\nРезультат умножения:\n\t" + multi);
                writer.Write("\nРезультат деления:\n\t");
                writer.WriteLine(div);



                Console.Write("Если хотите посмотреть время за которое выполняются операции нажмите v.\nВвод: ");
                if (Console.ReadLine() == "v")
                {
                    LongArifmetik.Statistic(first, second);
                }
                Console.Write("Показать результат возведения в степень. Нажмите v.\nВвод: ");
                if (Console.ReadLine() == "v")
                {
                    LongArifmetik pow = LongArifmetik.FastPow(first, second);
                    Console.WriteLine("\nРезультат возведения в степень:\n\t" + pow);
                    writer.WriteLine("\nРезультат возведения в степень:\n\t" + pow);
                }
                writer.Dispose();
                writer.Close();
                Console.Write("Если хотите посмотреть время за которое выполняется операция возведения в степень нажмите v.\nВвод: ");
                if (Console.ReadLine() == "v")
                {
                    LongArifmetik.StatisticPower(first, second);
                }

                Console.WriteLine("Для выхода нажмите Esc.");
            } while (Console.ReadKey().Key != ConsoleKey.Escape);
        }