Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: C++ - Многократное "длинное" деление (длинного на короткое)  (Прочитано 1284 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Shevchenko

  • Автор темы
  • Новичок
  • *
  • Сообщений: 29
  • Utilitas, Honor et Gloria.
    • Просмотр профиля
В общем есть задача на перевод с одной системы счисления в другие, где нужно использовать длинную арифметику (деление длинного на короткое). Само деление я смог написать, но не могу правильно повторять его и брать остаток (делю число в десятичной системе). Не буду писать много, чтобы не запутать, ниже опишу лишь цикл деления и его переменные.
for(int i = 0; i<count; i++) {
        rez[i] = (long_dv[i] + ost * 10);
        ost = rez[i] % sys_sch;
        rez[i] = rez[i] / sys_sch;
    }
/* count - количество цифр числа, rez[i] - массив
с частным от деления, long_dv - массив, где лежит число
 (в десятичной системе) ost - остаток от деления, sys_sch -
система счисления, в которую нужно перевести (ну, или просто делитель, по-сути).
*/
Понимаю, что если первые элементы меньше делителя, то на начале будут нули, но сам массив отдельно сдвинуть я смогу, проблема не в этом. Весь этот цикл нужно взять в еще один, который будет выполнятся до тех пор, пока число не "доделится" полностью, и не будет заполнен массив "остатков" от каждого деления. Но как узнать нужное количество итераций - я понять не могу. Буду очень благодарен за помощь, скажу честно, что на задачу убиваю уже второй день.
Decipimur specie recti

Оффлайн ShadowUser15

  • Активист
  • *
  • Сообщений: 714
    • Просмотр профиля
и? где этот внешний цикл?
По идее должна быть переменная-"каретка" которая отслеживает на каком куске массива мы находимся.
Условием выхода служит ситуация когда каретка в конце (начале) массива или за ним.
вероятное введение нестандартных десятичностей, внутри системы - заставляет задуматься о переходе на другой

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Как насчёт того, чтобы сравнить делимое(после очередной итерации) с делителем? Как только делимое станет меньше делителя — стоп циклу.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Protopopulus

  • Старожил
  • *
  • Сообщений: 1686
  • ちのう の きょうかん
    • Просмотр профиля
А не проще без велосипеда? GMP в помощь. Ну и да, для вывода в "основных" системах можно пользовать флаги форматирования, позволяющие отображать число в системах с базой 2, 8, 10 и 16.
« Последнее редактирование: 15 Октябрь 2014, 22:16:36 от Protopopulus »
Если ты владеешь знаниями, то и знания владеют тобой. (с) Protopopulus

 

Страница сгенерирована за 0.057 секунд. Запросов: 24.