Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Ф-ция преобразующая с 10 в другие сист. счисления


Автор: feanor777 14.5.2014, 16:41
Здравствуйте!
Передо мной стоит такая вот задача:
Написать функцию, которая получает в качестве аргументов целое положительное число и систему счисления, в которую это число должно переводится (системы счисления от 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 элементов!
А если пользователь вводит маленькое число у меня выходит кучу нулей. Как от этого избавиться?

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

Автор: baldina 14.5.2014, 18:30
- используй 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

Автор: feanor777 15.5.2014, 21:58
Цитата(baldina @ 14.5.2014,  18:30)
- используй std::string

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

Автор: feodorv 16.5.2014, 09:42
Цитата(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];

Автор: feanor777 18.5.2014, 22:36
Спасибо!
Можно было ссылочку дать 
Цитата

stringReverse(buffer);

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)