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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ф-ция преобразующая с 10 в другие сист. счисления, переводит с 10 в 2-36 системы счисления 
V
    Опции темы
feanor777
Дата 14.5.2014, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте!
Передо мной стоит такая вот задача:
Написать функцию, которая получает в качестве аргументов целое положительное число и систему счисления, в которую это число должно переводится (системы счисления от 2 до 36). Например, при переводе числа 27 в систему счисления 16 должно получиться 1B; 13 в 5-ю - 23; 35 в 18-ю - 1H.

Я её вроде бы реализовал, но такое чувство, что через ж*...

Вот код:
Код
#include <iostream>
using namespace std;
void radix(int digit,int power) //radix - система счисления ;)
{
    const int a=32;
    int ar[a];
    for(int i=a-1;i>=0;i--)
    {
        if(digit<power)
        {
            ar[i]=digit;
            break;
        }
        ar[i]=digit-((digit/power)*power);
        digit=digit/power;
    }
    for(int i=0;i<a;i++)
    {
        if(ar[i]<=0)
            ar[i]=0;
        else if(ar[i]>0)
            break;
    }
    for(int j=0;j<a;j++)
    {
        if(j>=4 && j%4==0)
        {
            cout<<"  ";
        }
        if(ar[j]>9)
        {
            char c=(ar[j]+55);
            cout<<c<<" ";
        }
        else if(ar[j]<=9 || ar[j]>=0)
            cout<<ar[j]<<" ";        
    }
    cout<<"\n";
}
void main()
{
    int dig,pow;
    cout<<"Enter digit: ";cin>>dig;
    do {
    cout<<"\n\nEnter pow: ";cin>>pow;
    }
    while(pow<2 || pow>36);
    radix(dig,pow);
}


Подскажите пожалуйста, как его можно оптимизировать?
Особенно интересует тот момент, что так как я не знаю какое число будет вводить пользователь, мне приходится создавать массив из 32 элементов!
А если пользователь вводит маленькое число у меня выходит кучу нулей. Как от этого избавиться?

Модератор: не забываем пользоваться кнопочкой "Код"

Это сообщение отредактировал(а) bsa - 15.5.2014, 10:21
PM MAIL   Вверх
baldina
Дата 14.5.2014, 18:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 15
Всего: 101



- используй std::string
- используй остаток от деления на основание системы
- добавляй цифры в конец, а выводи перевернутую строку
Код

std::string radix (int value, unsigned r) {
  std::string buffer;
  std::string sign;
  if (value < 0) {
     sign = "-";
     value = -value;
  }
  do {
    int digit = value % r;
    buffer += digit<10 ? '0'+digit : 'A'+(digit-10);
    value /= r;
  } while (value !=0);

  buffer += sign;
  return std::string(buffer.rbegin(), buffer.rend());
}


Добавлено через 37 секунд
http://ideone.com/INRu27
PM MAIL   Вверх
feanor777
Дата 15.5.2014, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(baldina @ 14.5.2014,  18:30)
- используй std::string

Спасибо большое я более менее разобрался! Но проблема в том, что я еще не учил строки (
Знаю только массивы =(

PM MAIL   Вверх
feodorv
Дата 16.5.2014, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(feanor777 @  15.5.2014,  22:58 Найти цитируемый пост)
Знаю только массивы =(

Ну, здесь два варианта:
  • как уже советовали, запихивать в буфер цифры с конца числа, а потом содержимое буфера перевернуть:
    Код

    int i = 0;
    do {
        unsigned int digit = value % r;
        buffer[i++] = digit<10 ? '0'+digit : 'A'+(digit-10);
        value /= r;
      } while (value !=0);
    buffer[i] = '\0';
    stringReverse(buffer); // самостоятельно написать или подсмотреть на винграде (такая тема уже была)
    cout << buffer << endl;
  • запихивать цифры числа с конца буфера по направлению к началу (тогда переворачивать содержимое буфера не нужно), а выводить буфер с последнего забитого символа:
    Код

    int i = sizeof(buffer)-1;
    buffer[i] = '\0';
    do {
        unsigned int digit = value % r;
        buffer[--i] = digit<10 ? '0'+digit : 'A'+(digit-10);
        value /= r;
      } while (value !=0);
    cout << &buffer[i] << endl;
Значение value советую брать как unsigned int, ибо:
Цитата(feanor777 @  14.5.2014,  17:41 Найти цитируемый пост)
целое положительное число

Тогда и со знаком возиться не нужно...

Добавлено через 3 минуты и 18 секунд
Имелось в иду:
Код

char buffer[32];



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feanor777
Дата 18.5.2014, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо!
Можно было ссылочку дать 
Цитата

stringReverse(buffer);

Я день разбирался в этом ;)

PM MAIL   Вверх
feodorv
Дата 18.5.2014, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(feanor777 @  18.5.2014,  23:36 Найти цитируемый пост)
Я день разбирался в этом ;)

Зато это победа!!!


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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