
06.10.2008, 22:28
|
|
Новичок
Регистрация: 21.09.2008
Сообщений: 16
Провел на форуме: 249855
Репутация:
52
|
|
Товарищи, нужна помощь, нужен код на С++ переводящий Сиситемы Счисления.
Тоесть как бы из Любой в любую (до 20-ричной) не на прямую, а через десятичную... буду благодарен
Сам бы ты точно не написал... А я осилил ^^
Фича моего кода такая, допустим надо перевести из 2-ной в 16-ную, сначала переводим в из 2-ной в десятичную, потом из десятичной в 16-ную (собственно, как ты и просил). 3 функции, только последняя возвращяет массив символов, первые две возвращают вещественное число. Комментарии я написал, пример использования функций тоже. ^^
Код:
/*переводит дробное число из одной СС в другую
(основание которой меньше 36)*/
#include <iostream>
#include <math.h>
char rezA[255];//буффер под вывод шестнадцатеричной СС
/*переводит из любой СС в десятичную (основание СС, указатель на строку,
с начальным числом*/
double perevod10(int num, char* base)
{
int n1=0,n2=0,i=0,rez1=0;
double rez2=0;
while ( base[++n1] != '.') { }
for (i=0; i<=n1-1; ++i)
{
if ((int)base[i] <= (int)'9')
{
rez1+=((int)base[i] - (int)'0') * (int)pow(num,n1-1-i);
}
else
{
rez1+=((int)base[i] - (int)'A' + 10) * (int)pow(num,n1-1-i);
}
}
while ( base[n1+1+(++n2)] != NULL) { }
for (i=n1+1; i<=n1+n2; ++i)
{
if ((int)base[i] <= (int)'9')
{
rez2+=((int)base[i] - (int)'0') * pow(num, -1-(i-n1-1));
}
else
{
rez2+=((int)base[i] - (int)'A' + 10) * pow(num, -1-(i-n1-1));
}
}
return rez1+rez2;
}
/*переводит из десятичной в СС, основание которой мешьше 10*/
double perevod2 (int num, double base)
{
const double e=0.01;
long base_temp1=(long)base,rez1=0,p=1;
double base_temp2=base - (long)base,rez2=0;
while (base_temp1!= 0)
{
rez1=rez1+ (base_temp1%num)*p;
base_temp1=base_temp1/num;
p=p*10;
}
while ((base_temp2) > e)
{
base_temp2*=num;
rez2=(rez2 + (long)base_temp2)*0.1;
base_temp2=base_temp2- (long)base_temp2;
}
return rez1+rez2;
}
/*переводит из десятичной в СС, основание которой больше 10*/
char* perevodA (int num, double base)
{
const double e=0.01;
char temp;
long base_temp1=(long)base,rez1=0,k=0,i=0;
double base_temp2=base - (long)base,rez2=0;
while (base_temp1!= 0)
{
if (base_temp1%num <= 9)
{
rezA[i]=(char)(base_temp1%num + (int)('0'));
}
else
{
rezA[i]=(char)(base_temp1%num + (int)'A' -10);
}
base_temp1=base_temp1/num;
++i;
}
for (k=0; k<i/2; ++k)
{
temp=rezA[k];
rezA[k]=rezA[i-1-k];
rezA[i-1-k]=temp;
}
rezA[i]='.'; ++i;
while ((base_temp2) > e)
{
base_temp2*=num;
if (base_temp2 <= 9)
{
rezA[i]=(char)(base_temp2 + (int)('0'));
}
else
{
rezA[i]=(char)(base_temp2 + (int)'A' -10);
}
base_temp2=base_temp2- (long)base_temp2;
++i;
}
rezA[i]=NULL;
return rezA;
}
int main()
{
std::cout << perevod10(2, "1100.011") << "\n"; //из двоичной в десятичную
std::cout << perevod10(16, "FF.8") << "\n";//из шестнадцатеричной в десятичную
std::cout << perevod2(2, 1.625) << "\n";//из десятичной в двоичную
std::cout << perevodA(16, 255.5) << "\n";//из десятичной в шестнадцатеричную
return 0;
}
|
|
|