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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2012, 21:03   #11
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Используйте 255-ную систему счисления
Хотелось бы мне узнать как? Мне действительно интересно как перевести число 32413241859713561378962387264897234 6278429649823444323234234222 в 255-систему счисления?
Цитата:
массив для внутреннего представления сделайте типа byte[]
Ну да, согласен, не подумал
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 30.01.2012, 21:31   #12
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от MooNDeaR Посмотреть сообщение
Хотелось бы мне узнать как? Мне действительно интересно как перевести число 32413241859713561378962387264897234 6278429649823444323234234222 в 255-систему счисления?
Поправка: 256-ная система (то есть в каждом разряде от 0 до 255). Получится число [201][181][69][254][223][65][96][38][128][247][95][79][65][46][15][56][224][194][172][81][159][98][159][84][63][110].
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 30.01.2012, 21:52   #13
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Получится число [201][181][69][254][223][65][96][38][128][247][95][79][65][46][15][56][224][194][172][81][159][98][159][84][63][110].
Как вы это сделали? Я ваще не вдупляю Обыкновенным делением на 255 ваще не обойтись
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 30.01.2012, 22:09   #14
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Как вы это сделали? Я ваще не вдупляю Обыкновенным делением на 255 ваще не обойтись
Немного сжульничал и использовал для этого класс System.Numerics.BigInteger - и деление на 256 весьма торт. Сейчас придумываю алгоритм для разбора строки без подобных средств - можно создать по экземпляру MyBigInt на каждый разряд числа и затем сложить их.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 31.01.2012, 01:00   #15
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Немного сжульничал и использовал для этого класс System.Numerics.BigInteger
Интересно вы так придумали Реализовать свой класс для больших чисел с помощью существуещего

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

Не нашел в сети ни одного алгоритма поразрядного перевода в другую систему счисления, пришлось самому придумывать (ух помучался!). Код, пожалуйста!
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace csharp_app_con
{
	delegate byte CharToByte(char c);
	class Program
	{
		static void Main(string[] args)
		{
			// Число на обработку
			string strDecimal = Console.ReadLine();
			
			// Разбиваем на десятичные разряды и заполняем ими очередь
			Queue<byte> numDecimal = new Queue<byte>();
			for (int i = 0; i < strDecimal.Length; i++)
			{
				CharToByte linearTransf = c =>
				{
					switch (c)
					{
						case '0': return 0;
						case '1': return 1;
						case '2': return 2;
						case '3': return 3;
						case '4': return 4;
						case '5': return 5;
						case '6': return 6;
						case '7': return 7;
						case '8': return 8;
						case '9': return 9;
						default:
							throw new ArgumentException();
					}
				};
				numDecimal.Enqueue(linearTransf(strDecimal[i]));
			}

			// Поразрядно переводим в двоичную систему
			Stack<bool> numBinary = new Stack<bool>();
			while (numDecimal.Any())
			{
				Queue<byte> numDecimalNew = new Queue<byte>();
				// --- поразрядное деление numDecimal на 2 ---
				while (numDecimal.Any() && numDecimal.Peek() == 0)
					numDecimal.Dequeue();
				if (!numDecimal.Any())
					break;
				bool mod = numDecimal.Peek() % 2 != 0;
				numDecimalNew.Enqueue((byte)(numDecimal.Dequeue() / 2));
				while (numDecimal.Any())
				{
					bool modNew = numDecimal.Peek() % 2 != 0;
					numDecimalNew.Enqueue((byte)(numDecimal.Dequeue() / 2 + (mod ? 5 : 0)));
					mod = modNew;
				}
				// --- остаток и есть разряд двоичного числа ---
				numBinary.Push(mod);
				numDecimal = numDecimalNew;
			}

			// Ныне имеем двочиное представление в numBinary
			// Группируем в блоки по 8 битов и записываем в байты
			// (Это делается просто с помощью поразрядных операций и мне лень)
		}
	}
}
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 31.01.2012, 07:18   #17
Sna1L
Форумчанин
 
Аватар для Sna1L
 
Регистрация: 15.03.2011
Сообщений: 272
По умолчанию

Тему не читал.

Я сам недавно это реализовывал на плюсах.Использовал интовые числа. Основание системы 1000(если реализуете еще и умножение, то вроде лучше использовать основание 100, только сейчас об этом подумал ).
Т.е. в классе был массив. число располагалось от единиц к десяткам, т.е. в первом элементе было записанно число х*(тыща в нулевой степени), во втором y*тыща и т.д. Еще была переменная len, в которой хранилось кол-во разрядов.

Алгоритм сравнения был такой: сравниваем кол-во разрядов. Если не равно, то всё понятно, а если нет, то сверяем начиная со старшего разряда.

Сложение было такое:
складываем первый эл-т. Если результат >999 то вычетаем 1000, и прибавляем единицу к следующему разряду и т.д. То же самое мы делаем при сложении "в столбик"

Над умножением уже сами думайте
Но код получился у меня весьма большой
ЗЫ вроде доступно обьяснил
ЗЫЫ если интересует, могу скинуть код(напоминаю: на плюсах, а не шарпе)

Последний раз редактировалось Sna1L; 31.01.2012 в 07:33.
Sna1L вне форума Ответить с цитированием
Старый 31.01.2012, 10:47   #18
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Цитата:
Не нашел в сети ни одного алгоритма поразрядного перевода в другую систему счисления, пришлось самому придумывать (ух помучался!). Код, пожалуйста!
Спасибо, почитал, всё в принципе ясно . Только при очень больших числах (больше 150 разрядов) будут получатся очень большие очереди. Числа будут очень долго формироваться. Зато память сэкономите.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 08.02.2012, 22:54   #19
_Varyag_
Пользователь
 
Регистрация: 13.01.2011
Сообщений: 14
По умолчанию

Вопрос, почему тут отнимаем 48 :
Код:
 {
        Number = new byte[Num.Length];
        for (int i = Num.Length - 1, j = 0; i >= 0; i--, j++)
        {
            Number[j] = (byte)((int)Num[i] - 48);
        }
    }
?

Теперь проблема с умножением =\
вроде как должно было бы работать, но увы. ошибка выхода за границы массива. Помогите плз
Код:
using System;
class Lab
{
    static byte[] tt;
    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);
        tt = new byte[Len + 1];
        int i = 0, j = 0, k = 0;
        for (i = 0; i < Len + 1; i++)
        {
            tt[i] = 0;
        }
        result.Number[0] = ob1.Number[0];
        for (i = 1; i <= ob2.Number[0]; i = i + 1)
        {
            for (j = 1; j < ob1.Number[0]; j++)
            {
                result.Number[j] = 0;
            }
            for (j = 1, k = i; j < ob1.Number[0] - 1; j = j + 1, k = k + 1)
            {
                result.Number[j + 1] = (byte)((ob1.Number[j] * ob2.Number[i] + result.Number[j] + tt[k]) / 10);
                result.Number[j] =(byte)((ob1.Number[j] * ob2.Number[i] + result.Number[j] + tt[k]) % 10);
            }
            if (result.Number[j] != 0) result.Number[0] = (byte)(result.Number[0] + 1);
            for (j = i, k = 1; j < result.Number[0] ; j = j + 1, k = k + 1)
            {
                tt[j] = result.Number[k];
            } 
            tt[0] = result.Number[0];
        }
        for (i = 0; i <= result.Number[0]; i = i + 1)
        {
            result.Number[i] = tt[i];
        }
        return result;
    }
}


class Demo
{
    static void Main()
    {
        Lab num1 = new Lab("234563");
        Lab num2 = new Lab("34567");
        Lab result = num1 * num2;
        result.Show();
        Console.ReadKey();
    }
}

Последний раз редактировалось Stilet; 20.02.2012 в 19:53.
_Varyag_ вне форума Ответить с цитированием
Старый 20.02.2012, 18:47   #20
_Varyag_
Пользователь
 
Регистрация: 13.01.2011
Сообщений: 14
По умолчанию

последний вопрос все-еще актуален
_Varyag_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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