Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывод больших чисел, как перевести в 10-ю систему 
:(
    Опции темы
turbanoff
Дата 10.5.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009

Репутация: нет
Всего: 1



есть массив int[size]
забит соответственно "большим" числом.
вопрос в том, как собственно, преобразовать его в приемлемый для вывода вид (встроку).

по младшему адресу - младшая часть "большого числа".

задача состоит в идее алгоритма, т.е. о эффективности дело не идет. как можно более понятней и наглядней.
PM MAIL   Вверх
zim22
Дата 10.5.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Код

#include <string>

int main()
{
  const int size = 10;  
  int array[size] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 8};
  std::string number;
  char buf[2];
  for (int i = size - 1; i != -1; --i)
    number += itoa(array[i], buf, 10);

    return 0;
}



--------------------
PM MAIL   Вверх
turbanoff
Дата 10.5.2009, 21:40 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009

Репутация: нет
Всего: 1



мде, ладно, как я понял не все понимают, что я имел ввиду под "большими" числами.

int - 4 байта

т.е. число

0x100000001

будет храниться как
int array[2] = {1 ,1};

требуется процедура вывода таких чисел в 10-ном формате

Это сообщение отредактировал(а) turbanoff - 10.5.2009, 21:43
PM MAIL   Вверх
math64
Дата 10.5.2009, 22:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Сделай процедуру деления таких чисел на 10
Код

class BigNumber {
   int[] number;
   int size;
public:
   Number();
   Number(const Number&);
   ~Number();
   Number operator/(int);
   Number operator-();
   int operaator%(int);
   bool operator <(int);
   bool operator >(int);
   string ToString();
};
string Number::ToString() {
  bool sign = false;
  Number n = *this();
  if (n < 0) { n = -n; sign = true; }
  string res;
  do {
    int d = n % 10;
    n = n / 10;
    res = char('0'+d) + res;
  } while (n > 0);
  if (sign)
    res = '-' + res;
  return res;
}

PM   Вверх
turbanoff
Дата 10.5.2009, 22:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009

Репутация: нет
Всего: 1



аааа, точно(((

забыл сказать без "общей" реализации деления для "больших" чисел  smile 

ну или хотя бы меня устроит "понятная" реализация деления, потому что в больш-ве библиотек, рассмотренных мною, оптимизация внесла свою лепту, причем весьма значительную

Это сообщение отредактировал(а) turbanoff - 10.5.2009, 23:02
PM MAIL   Вверх
math64
Дата 11.5.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Можно делить не на 10, а на 1 000 000 000, что сократит число делений в 9 раз и определять остаток от деления вместе с частным, что сократит число делений ещё в 2 раза. Отстаток преобразовывать в десятичный вид с помощью стандартных функций (itoa, (s)printf, ostream<<)

Добавлено через 8 минут и 29 секунд
Кстати, не нужно деление большого числа на большое, а только большого на обычное
Код

unsigned int bigdiv(int length,unsigned  int dividend[], unsigned int divisor, unsigned int quotient[]) {
unsigned __int64 num = 0;
for (int i = 0; i < length; i++) {
  num <<= 32;
  num += dividend[i];
  quotient[i] = (unsigned int)(num / divisor);
  num %= divisor;
}
return (unsigned int)num; //остаток
} 

PM   Вверх
turbanoff
Дата 13.5.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009

Репутация: нет
Всего: 1



спс) хорошая идея...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.