Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2012, 21:49   #1
_Varyag_
Пользователь
 
Регистрация: 13.01.2011
Сообщений: 14
По умолчанию C# Длинная арифметика

Задание по тому что вообще не понимаю, поэтому текст такой корявый. Делал тупо по блок-схемам из методички. Надо прибавить и сравнить два длинных числа. На сравнении вроде что-то и выводит, но на сумме..
Помогите плз, заранее спасибо.
Код:
using System;
namespace SumMore
{
    class Program
    {
        public static void Main(string[] args)
        {
            Lab Lab = new Lab();  
            Lab.Input1();
            Lab.Input2();
            Lab.SumLong();
            Console.Write("a + b = ");
            Lab.Output();
            Console.Write("a > b : ");
            Lab.More();
            Console.ReadLine();
        }
    }
    class Lab
    {
        public static char MaxDig = (char)100, Osn = (char)10000, f = (char)10;
        public char result, i;
        public char ch;
        Char[] A = new Char[100];
        Char[] B = new Char[100];
        Char[] a = new Char[100];
        char[] b = new char[100];
        static char[] Sum = new char[MaxDig * 10000];
        public void Input1()
        {
            Console.WriteLine("Vvedit 1 chuslo");
            try
            {
                for (i = (char)0; i < 100; i++)
                {
                    A[i] = Convert.ToChar(Console.ReadLine());
                }
            }
            catch
            {
                Console.WriteLine("Vvedit 2 chuslo");
            }
            for (int i = 0; i < MaxDig; i++)
                   a[i] = (char)0;
            for (int j = 0; A[j] != '\0'; j++)
            {
                if (Char.IsDigit(A[j]))
                {
                    for (int i = a[0]; i > 0; i--)
                    {
                        a[i + 1] += (char)(a[i] * (char)10 / Osn);
                        a[i] *= (char)(10 % Osn);
                    }
                    ch = A[j];
                    a[1] += ch;
                    if (a[a[0] + 1] > 0)
                         a[0]++;
                }
            }
        }
        public void Input2()
        {
            try
            {
                for (int i = 0; i < 100; i++)
                {
                    B[i] = Convert.ToChar(Console.ReadLine());
                }
            }
            catch
            {
                Console.WriteLine("Resultat : ");
            }
            for (int i = 0; i < MaxDig; i++)
                  b[i] = '\0';
            for (int j = 0; B[j] != '\0'; j++)
            {
                if (Char.IsDigit(B[j]))
                {
                    for (i = b[0]; i >= 1; i--)
                    {
                        b[i + 1] += (char)(b[i] * (char)10 / Osn);
                        b[i] *= (char)(10 % Osn);
                    }
                    ch = B[i];
                    b[1] += ch;
                    if (b[b[0] + 1] > 0)
                         b[0]++;
                }
            }
        }
        public int N = 0, NN = 1, p, S_Osn;
        public void Output()
        {
            S_Osn = Sum[0];
            for (i = (char)(Sum[0]); i > 0; i--)
            {
                N = Sum[i];
                if (N == 0)
                   NN = 0;
                for (p = 1; N > 0; p *= 10)
                    N /= 10;
                while (Osn - p != 0)
                {
                    if (Sum[0] == i)
                         break;
                    Console.Write("0");
                    p *= 10;
                }
                if (NN == 1)
                {
                    result = Sum[i];
                    Console.Write(result);
                }
                NN = 1;
                N = 0;
            }
        }
        public void SumLong()
        {
            char k;
            for (i = (char)0; i < MaxDig; i++)
                 Sum[i] = (char)0;
            if (a[0] > b[0])
                k = a[0];
            else
                k = b[0];
            for (i = (char)1; i < k + 1; i++)
            {
                Sum[i + 1] = (char)((Sum[i] + a[i] + b[i]) / Osn);
                Sum[i] = (char)((Sum[i] + a[i] + b[i]) % Osn);
            }
            if (Sum[k + 1] == 1)
                Sum[0] = (char)(k + 1);
            else
                Sum[0] = k;
       }
        public int e;
        public void More()
        {
            if (a[0] > b[0])
                e = 1;
           else
                e = 0;
            for (long i = a[0]; i > 0; i--)
            {
                if (a[i] == b[i])
                      continue;
                else
                {
                    if (a[i] > b[i])
                        e = 1;
                    else
                        e = 0;
                }
            }
            if (e == 1)
                Console.Write("true");
            else
                 Console.Write("false");
           }
    }
}
_Varyag_ вне форума Ответить с цитированием
Старый 29.01.2012, 21:57   #2
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Что-то прочитал я топик, зашел, что от меня хотят не понял нефига Прочитал код, ваще, если честно, офигел. Что хотите-то? Что для вас длинная арифметика?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 29.01.2012, 22:21   #3
_Varyag_
Пользователь
 
Регистрация: 13.01.2011
Сообщений: 14
По умолчанию

Да я сам фигею =)
Ну как бы действия с числами, которые не можно представить обычными типами данных.
А хочу чтобы показали где ошибка, ибо работает неправильно
_Varyag_ вне форума Ответить с цитированием
Старый 29.01.2012, 23:32   #4
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
которые не можно представить обычными типами данных.
Вы имеете ввиду, например, целые числа в 60 разрядов? Если так, то нафига вам столько кода для реализации сравнения и сложения?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 30.01.2012, 01:01   #5
_Varyag_
Пользователь
 
Регистрация: 13.01.2011
Сообщений: 14
По умолчанию

Ну как-бы из-за того что их нельзя представить по-простому, их надо записывать в массив, соответственно по-своему прибавлять и сравнивать. Вот и столько кода получается.
_Varyag_ вне форума Ответить с цитированием
Старый 30.01.2012, 09:53   #6
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Как я понял тебе нада сложить сколь угодно большие числа. Код читать лень но кодится сумма проще некуда. в 1-н фор и с буфером для результата. За идею суммирования - суммирования столбиком.

12345678
+
3212
---------
Рузельтат.

фор по длине меньшего числа, и сложение поразрядно по прицепу Int32.Parse(str[i]) + Int32.Parse(str[i]) и если результат больше 10 то в буфер первый разряд а при сложении слудещего разряда треубется добавить то что до этого остлось.
Guy вне форума Ответить с цитированием
Старый 30.01.2012, 13:28   #7
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Сразу хотелось бы извинится, по поводу комментария о кол-ве кода. У самого вышло много. Вот программа:
Код:
using System;

class Lab
{
    byte[] Number;           //Массив под длинное число.
    public int Length       //Св-во с длиной чилса
    {
        get
        {
            return Number.Length;
        }
    }

    private Lab(int Len)   //Внутренний конструктор для оператора +
    {
        Number = new byte[Len];
        for (int i = 0; i < Len; i++)
        {
            Number[i] = 0;
        }
    }

    public Lab(string Num)  //Конструктор. Принимает на вход строку
                            //можно заметить, что число заполняется с конца
                            //Это удобней, поверьте.
    {
        Number = new byte[Num.Length];
        for (int i = Num.Length - 1, j = 0; i >= 0; i--, j++)
        {
            Number[j] = (byte)((int)Num[i] - 48);
        }
    }

    public void Show()     //Метод для отображения числа.
    {
        for (int i = Number.Length - 1; i >= 0; i--)
        {
            if (i == (Number.Length - 1) && Number[i] == 0) continue;
            Console.Write(Number[i]);
        }
        Console.WriteLine();
    }
                            //перегруженный оператор "+". Исключает ошибки.
    public static Lab operator +(Lab ob1, Lab ob2)
    {
        int Len = ob1.Length > ob2.Length ? ob1.Length : ob2.Length;
        Lab result = new Lab(Len + 1);
        byte buffer = 0;
        for (int i = 0; i < Len + 1; i++)
        {
            if ((i < ob1.Length) && (i < ob2.Length))
            {
                result.Number[i] = ob1.Number[i] + ob2.Number[i] + buffer;
                buffer = result.Number[i] / 10;
                result.Number[i] %= 10;
            }
            else
            {
                if (ob1.Length > ob2.Length)
                {
                    for (int j = i; j < Len; j++)
                    {
                        result.Number[j] = (ob1.Number[j] + buffer);
                        buffer = result.Number[j] / 10;
                        result.Number[j] %= 10;
                    }
                    result.Number[Len] = buffer;
                    break;
                }
                else
                {
                    for (int j = i; j < Len; j++)
                    {
                        result.Number[j] = (ob1.Number[j] + buffer);
                        buffer = result.Number[j] / 10;
                        result.Number[j] %= 10;
                    }
                    result.Number[Len] = buffer;
                    break;
                }
            }
        }
        return result;
    }

    //перегруженные операторы сравнения.
    public static bool operator ==(Lab ob1, Lab ob2)
    {
        if (ob1.Length != ob2.Length) return false;
        for (int i = 0; i < ob1.Length; i++)
            if (ob1.Number[i] != ob2.Number[i]) return false;
        return true;
    }
    public static bool operator !=(Lab ob1, Lab ob2)
    {
        if (ob1.Length != ob2.Length) return true;
        for (int i = 0; i < ob1.Length; i++)
            if (ob1.Number[i] != ob2.Number[i]) return true;
        return false;
    }
}

class Demo
{
    static void Main()
    {
        Lab num1 = new Lab("1250");
        Lab num2 = new Lab("250");
        Lab result = num1 + num2;
        result.Show();
        Console.WriteLine(num1 == num2);
        Console.WriteLine(num1 != num2);
        Console.ReadKey();
    }
}
Как вы могли заметить, теперь можно создавать объекты Lab, складывать их и проверять на равенство.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 30.01.2012 в 21:06.
MooNDeaR вне форума Ответить с цитированием
Старый 30.01.2012, 14:54   #8
_Varyag_
Пользователь
 
Регистрация: 13.01.2011
Сообщений: 14
По умолчанию


Большое спасибо Буду разбираться
_Varyag_ вне форума Ответить с цитированием
Старый 30.01.2012, 16:21   #9
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Большое спасибо Буду разбираться
Не за что. Если что, пишите в личку, расскажу что да как.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 30.01.2012, 18:46   #10
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Используйте 255-ную систему счисления, массив для внутреннего представления сделайте типа byte[], в каждом байте храните по одному разряду - иначе расходуете память впустую. А, ну и еще есть стандартный класс System.Numerics.BigInteger - чем не вариант?
Ищете информацию по C++?
cplusplus.com

Последний раз редактировалось Сtrl; 30.01.2012 в 18:49.
Сtrl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длинная арифметика nervniy Общие вопросы Delphi 4 19.04.2011 23:18
Длинная арифметика на C++ Kingdom_Reborn Помощь студентам 0 06.04.2011 22:32
Длинная арифметика. Steam.dll Помощь студентам 8 03.04.2011 17:47
длинная арифметика Dimarik Общие вопросы C/C++ 1 16.09.2009 12:02
Длинная арифметика DmT Помощь студентам 2 06.10.2007 22:43