[С/C++] Перевод чисел из системы счисления Х в сс Y
Привет народ! Можете помочь с алгоритмом или программой перевода чисел из P-итой системы счисления в Q-итую. Пожалуйста, очень нужно!
Что такое Q и P системы? Известные системы счисления это: H(16), B(2), O( 8 ), D(10). Если нужен алгоритм перевода в этих системах могу написать.
Что такое Q и P системы? Известные системы счисления это: H(16), B(2), O( 8 ), D(10). Если нужен алгоритм перевода в этих системах могу написать.
Это только известные, а по идее они могут быть всякие: третичные, четвертичные и т.д.
Чел наверное и имел в виду перевод из любой СС в любую СС.
Чтобы из любой СС перевести в десятичную СС :
x = An*Q^n + An-1*Q^(n-1) + ... + A1*Q^1 + A0*Q^0.+A(-1)*Q^(-1) + ... + A(-m)*Q^(-m)
Пример1: нужно перевести число (5Dh) в десятичную СС :
5Dh = 5h * 16^1 + Dh * 16^0 = 13d + 80d = 93d
Пример2: нужно перевести число (11011.11b) в десятичную СС :
11011.11b = 1*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 + 1*2^(-1) + 1*2^(-2) = 16 + 8 + 0 + 2 + 1 + 0.5 + 0.25 = (27.75)d
Чтобы из десятичной СС перевести в любую другую нужно это число делить на Q до тех пор пока не получим целую часть равной 0:
Пример: нужно перевести число (156d) в СС 8(oct, т.е. Q = ( 8 )):
156 / 8 = 19 (4) <- в скобках остаток
19 / 8 = 2 (3)
2 / 8 = 0 (2)
Получили что (156d) = (234o) - [COLOR=purple]читаем числа в скобках с низу вверх[/COLOR].
Это перевод целого числа.
функция itoa, если для С++
itoa позволяет переводить числа только между 2, 8, 10, 16 СС
itoa позволяет переводить числа только между 2, 8, 10, 16 СС
А ВОТ И НЕТ
Всем спасибо за участие, только проблема в одном осталась. Прога выводит число, обратном порядке, как от этого избавиться? Прилагаю файл
Код выложи. Хотя для тебя лучше если ошибку найдешь сам.
P.S.
Думаю проблема в следущем:
если при переводе программа обрабатывает данное число в два этапа:
1 - переводит в СС 10
2 - переводит в заданную СС
то на втором этапе результат выходит в обратном порядке и ты сразу его расспечатываешь, а нужно сохранить(в массиве например) и расспечатывать в правильном порядке после полного окончания этапа 2.
//-----------------------------------------------
#include <stdio.h>
#include <conio.h>
#include <vcl.h>
#include <math.h>
#include <string.h>
#pragma hdrstop
//------------------------------------------------
#pragma argsused
int CharToInt( char alpha )
{
for( int i = 'A' ; i < 'J' ; i++ )
if( alpha == i )
return i - 65 + 10 ;
return alpha - 48 ;
}
int ConvertToDec(char input[32] , int sinp )
{
int sum = 0 ;
for( int i = 0; i < strlen( input ) ; i++ )
sum += CharToInt(input) * pow( sinp , strlen(input)-i -1 );
return sum ;
}
void convertX( int input , int sout )
{
while( input != 0 )
{
printf( "%i " , input % sout);
input /= sout;
}
}
int main(int argc, char* argv[])
{
printf("Vvedite nachalnoe chislo: " );
char input[32] = "";
scanf("%s", &input);
printf("\nVvedite nachalnuiu codirovku: ");
int sinp;
scanf("%i", &sinp);
printf("\nVvedite conechnuiu codirovku: ");
int sout;
scanf("%i", &sout);
printf("\n\n=");
convertX( ConvertToDec(input , sinp) , sout );
getch();
return 0;
}
//------------------------------------------------
Выкладываю код программы.
void convertX( int input , int sout )
{
while( input != 0 )
{
printf( "%i " , input % sout);
input /= sout;
}
}
....
... то на втором этапе результат выходит в обратном порядке и ты сразу его расспечатываешь, а нужно сохранить(в массиве например) и расспечатывать в правильном порядке после полного окончания этапа 2.
Расспечатыбай массив c КОНЦА а не сначала.
я же сразу написала в чём проблема. Внимательно перечитай все мои сообщения вклучая алгоритм перевода из СС в СС.
Ваша прога может сделать перевод с 10 в 16???
Можно один безобидный вопрос???
Ваша прога может сделать перевод с 10 в 16???
Mожет. Eсли исправить ошибку (об ошибке читай выше), а лучше читай алгортм перевода (написано выше) и напиши свою программу.
Mожет. Eсли исправить ошибку (об ошибке читай выше), а лучше читай алгортм перевода (написано выше) и напиши свою программу.
Оля, Arad это в Пенсилвании?
Если да, то немношко странно. До этих пор я был уверенный, что там живут только румыни и венгры.
На счет программы.
Вывод осуществляется через printf( "%i " , input % sout);
Если sout = 16, тогда вместо A выводится 10, вместо B 11 итд.
Как минимум нужен был бы printf( "%x "...
Оля, Arad это в Пенсилвании?
Если да, то немношко странно. До этих пор я был уверенный, что там живут только румыни и венгры.
Ну допустим с геограгией у тебя проблемы, так же как и у меня. Ну это не страшно, google эту проблему решает быстро.
На счет программы.
Вывод осуществляется через printf( "%i " , input % sout);
Если sout = 16, тогда вместо A выводится 10, вместо B 11 итд.
Как минимум нужен был бы printf( "%x "...
%х читает только СС 16, а %i читает СС 10, 8 и 16 (если верить Дейтелу).
%х читает только СС 16, а %i читает СС 10, 8 и 16 (если верить Дейтелу).
%i это Signed decimal integer(MSDN). Т.е через него можно выводить системы числения от 2 до 10.
а x Unsigned hexadecimal integer, using “abcdef.”
т.е. выводит от 2 до 16.
%i это Signed decimal integer(MSDN). Т.е через него можно выводить системы числения от 2 до 10.
а x Unsigned hexadecimal integer, using “abcdef.”
т.е. выводит от 2 до 16.
Я имела ввиду функцию scanf а не printf, есть разница. Проверила в программе: действительно читает СС 10 и СС 16 (только перед числом нужно написать 0х) а считать СС 8 не получилось (писала перед числом 'о') но сейчас мне это неочень важно. А в printf действительно %i ввыводит только signed intenger.
А программа недорабона, думаю ты прав %х самый лучший вариант.
А программа недорабона, думаю ты прав %х самый лучший вариант.
Ну видишь, видишь. А то вчера ты меня уже к google отправляла. :)
#include <conio.h>
#include <vcl.h>
#include <math.h>
#include <string.h>
#pragma hdrstop
//------------------------------------------------
#pragma argsused
int CharToInt(char alpha)
{
if(alpha<58 )
return alpha - 48;
else
return alpha - 55;
}
int ConvertToDec(char *input , int sinp )
{
int sum = 0;
int pow = 1;
for(int i = strlen(input)-1; i>=0; i--)
{
sum+=CharToInt(input) * pow;
pow*=sinp;
}
return sum ;
}
char *convertX(int input, int sout, char *out)
{
while(input!=0)
{
byte j = input%sout;
input/=sout;
out--;
if(j<10)
*out = 48 + j;
else
*out = 55 + j;
}
return out;
}
int main(int argc, char* argv[])
{
printf("Vvedite iszhodnoe chislo: " );
char input[32] = "";
scanf("%s", &input);
printf("\nVvedite nachalnuiu codirovku: ");
int sinp;
scanf("%i", &sinp);
printf("\nVvedite conechnuiu codirovku: ");
int sout;
scanf("%i", &sout);
printf("\n\n= ");
char output[32];
output[31] = 0;
printf("%s", convertX(ConvertToDec(input, sinp), sout, output+31));
printf("\n\nNazsmite ljubuju klavisu...");
getch();
return 0;
}
.......
char output[32];
output[31] = 0;
printf("%s", convertX(ConvertToDec(input, sinp), sout, output+31));
printf("\n\nNazsmite ljubuju klavisu...");
getch();
return 0;
}[/code]
Выглядит красиво, только одно но : ты работаешь с 4 байтами для сохранения результата. Все разряды заполняешь нулями и (если я не ошибаюсь) независимо от полученного результата распечатываешь всегда все 4 байта |=> печатаешь нули в старших разрядах когда результат < 1FFFFFFFh. Нехорошо:!!!:
Выглядит красиво, только одно но : ты работаешь с 4 байтами для сохранения результата. Все разряды заполняешь нулями и (если я не ошибаюсь) независимо от полученного результата распечатываешь всегда все 4 байта |=> печатаешь нули в старших разрядах когда результат < 1FFFFFFFh. Нехорошо:!!!:
:)
Результат записывается в char output[32];
Сперва в 31ю позицию пишется 0.
А в ф-ии convertX например при результате "170"
Сперва '0' пишется в 30-ю позицию, потом
'7' в 29-ю, '1' в 28-ю.
И возвращается указатель на 28ю позицию, что и выводится.
:)
Результат записывается в char output[32];
Сперва в 31ю позицию пишется 0.
то что в чарах сохраняется результат это очевидно. под 4 байтами имела ввиду разрядность числа которое можно отобразить в 32 символах но это я погaрячилось : если бинарное число выводить тогда действительно 4byte а в СС 16 это 16 byte, короче сработала реакция на число 32 и не подумала что в char сохраняем 1 значение но это не '0' или '1' а '0' ... 'F'.
char output[32];
printf("%s", convertX(ConvertToDec(input, sinp), sout, output+31));
Лучше объяцни зачем в 31-ю ячейку ноль отправляешь, я было подумала что это вроде того как int arr[32] = {0}; => забиваем во все ячейки нули.
P.S.А насчет указателя ошиблась(давно с ними неработала Слиха).:( I am sorry.
Лучше объяцни зачем в 31-ю ячейку ноль отправляешь, я было подумала что это вроде того как int arr[32] = {0}; => забиваем во все ячейки нули.
Это нулевой символ в конце строки(занимает 1 байт).
Это нулевой символ в конце строки(занимает 1 байт).
Я привыкла '\0' потому и не узнала. За что С люблу так это за многогранность. :)
а что у вас за навязчивая идея - сначала в десятичную перевести ? в компе вроде двоичное представление чисел . ;)
да и вообще - обратное деление на основание СС может переводить из любой СС в любую .надо только сделать универсальное представление чисел штоб для любой СС подходила и научить прогу операции деления в этом представлении .
интересно , а СС64 (бедные шумеры -) ) ваша прога сделать может ? :D
а что у вас за навязчивая идея - сначала в десятичную перевести ? в компе вроде двоичное представление чисел . ;)
да и вообще - обратное деление на основание СС может переводить из любой СС в любую .надо только сделать универсальное представление чисел штоб для любой СС подходила и научить прогу операции деления в этом представлении .
Ну если ты такой умный научи студентов жизни, лично я буду благодарна. :)
а что у вас за навязчивая идея - сначала в десятичную перевести ? в компе вроде двоичное представление чисел . ;)
Рада буду увидеть как например из СС 2 ты напрямую перейдешь в СС 3, а то нас на ассемблере глупостям учили : перейти из СС в СС можно только если они связанные. Например Q = 2^n где n > 0, а Q основание СС.
Рада буду увидеть как например из СС 2 ты напрямую перейдешь в СС 3, а то нас на ассемблере глупостям учили : перейти из СС в СС можно только если они связанные. Например Q = 2^n где n > 0, а Q основание СС.
Если они связанные, то переход действительно осуществляется через Q = 2^n, но как сказал koderAlex возможен непосредственный переход из одной СС счисления в другую. Переход через десятичную используется если только для удобства.
Например, надо перевести из 3 в 7. Как 3 связана с 10 и как 7 связана 10, также как и 3 с 7 - никак!!!
интересно , а СС64 (бедные шумеры -) ) ваша прога сделать может ? :D
Конечно. Напр. 170(СС10)==2a(CC64)
а что у вас за навязчивая идея - сначала в десятичную перевести ? в компе вроде двоичное представление чисел . ;)
Где ты видишь перевод в десятичный? Так называемая ф-ия ConvertToDec переводит строковое представление числа в int.
Универсальное представление уже "сделано" - это двоичная система счисления.
Если они связанные, то переход действительно осуществляется через Q = 2^n, но как сказал koderAlex возможен непосредственный переход из одной СС счисления в другую. Переход через десятичную используется если только для удобства.
Например, надо перевести из 3 в 7. Как 3 связана с 10 и как 7 связана 10, также как и 3 с 7 - никак!!!
Нет в тех программах 10го представления. Есть только двоичное.
Нужно перевести число из CC3 в CC7.
Напр. 2222(СС3). Для этого его нужно делить на 21(СС3). Или перевести оба числа в int (80 и 7). Или написать программу символьного деления для любого CC. Минимум несколько сот операторов.
Мне интересно было бы посмотреть на эту прогу. Сможешь ее написать?
Напр. 2222(СС3). Для этого его нужно делить на 21(СС3). Или перевести оба числа в int (80 и 7). Или написать программу символьного деления для любого CC. Минимум несколько сот операторов.
Мне интересно было бы посмотреть на эту прогу. Сможешь ее написать?
Такую программу писал еще в студенческую пору на Borland C++ 3.11, постараюсь найти её и выложить, она как раз использует символьное деление вплоть до 36 СС (a-z, 0-9). Но можно будет расширить
Такую программу писал еще в студенческую пору на Borland C++ 3.11, постараюсь найти её и выложить, она как раз использует символьное деление вплоть до 36 СС (a-z, 0-9). Но можно будет расширить
Ok. Ждемс...
...
Например, надо перевести из 3 в 7. Как 3 связана с 10 и как 7 связана 10, также как и 3 с 7 - никак!!!
Спасибо, дошло.
Ok. Ждемс...
Спешу вас растроить, т.к. программу я так и не нашел... :(
Но если она тебе очень нужна можно написать её еще раз
Спасибо, дошло.
Ну вот . Теперь и учить уже не надо :(
А так хотелося :D .
Ну вот . Теперь и учить уже не надо :(
А так хотелося :D .
Ну если очень хочеться ты не тормози, можешь попробовать. Я всегдa готова перенять опыт от профессионалов дела, а не слова. ;)
Тут на форуме integral написал задачу "биты числа" ну очень интересно посмотреть как такую задачу решит настоящий програмист а не шумеры не... .
Тут на форуме integral написал задачу "биты числа" ну очень интересно посмотреть как такую задачу решит настоящий програмист а не шумеры не... .
Ко дну 8 Марта :)
#include "stdio.h"
#include "conio.h"
void float2char(double f, char *ch)
{
int *i = (int *)&f;
for(int j = 0; j<32; j++)
{
if(*i&0x80000000)
*ch = '1';
else
*ch = '0';
ch++;
*i = (*i)<<1;
}
i++;
for(j = 0; j<32; j++)
{
if(*i&0x80000000)
*ch = '1';
else
*ch = '0';
ch++;
*i = (*i)<<1;
}
*ch = '\0';
}
int main(int argc, char* argv[])
{
char ch[65];
double f = 46565.78;
float2char(f, ch);
printf("%f = %s", f, ch);
printf("\n\n nazsmite ljubuju klavisu...");
getch();
return 1;
}
Ко дну 8 Марта :)
#include "stdio.h"
#include "conio.h"
void float2char(double f, char *ch)
{
int *i = (int *)&f;
for(int j = 0; j<32; j++)
{
if(*i&0x80000000)
*ch = '1';
else
*ch = '0';
ch++;
*i = (*i)<<1;
}
i++;
for(j = 0; j<32; j++)
{
if(*i&0x80000000)
*ch = '1';
else
*ch = '0';
ch++;
*i = (*i)<<1;
}
*ch = '\0';
}
int main(int argc, char* argv[])
{
char ch[65];
double f = 46565.78;
float2char(f, ch);
printf("%f = %s", f, ch);
printf("\n\n nazsmite ljubuju klavisu...");
getch();
return 1;
}
Спасибо конечно за поздравление хотя вижу его уже не первый раз.;)
Если честно против битов ничего не имею но есть проблема : у меня в компьютере твоя программа Правильно не работает.
int *i = (int *)&f;
printf("%d\n\n",*i);
расспечатываю *i после твоего конверта и ничего хорошего не вижу. Проверь у себя , подставь double f = 1.0; и сообщи результаты пожалуйста в честь 8 марта. :}
P.S. моё предложение К KoderAlex в любом случае в силе!! не люблю голословщины страшно, а учиться люблю.:)
Правильная прога
#include "stdio.h"
#include "conio.h"
void float2char(double f, char *ch)
{
int *i = (int *)&f + 1;
for(int j = 0; j<32; j++)
{
if((*i)&0x80000000)
*ch = '1';
else
*ch = '0';
ch++;
*i = (*i)<<1;
}
i--;
for(j = 0; j<32; j++)
{
if((*i)&0x80000000)
*ch = '1';
else
*ch = '0';
ch++;
*i = (*i)<<1;
}
*ch = '\0';
}
int main(int argc, char* argv[])
{
char ch[65];
double f = 1;
float2char(f, ch);
printf("%f = %s", f, ch);
printf("\n\n nazsmite ljubuju klavisu...");
getch();
return 1;
}
Ко дну 8 Марта :)
int *i = (int *)&f;
Мне кажется я тут интересный факт нашла :
double f = 46565.78;
printf("%d\n\n", f); |=> (-171798692)
Надо работать с unsigned intenger... .
хотя программе и это не помогает. Честно говоря о твоей операции convert (int *i = (int *)&f ) ничего сказать не могу.
Мне кажется я тут интересный факт нашла :
double f = 46565.78;
printf("%d\n\n", f); |=> (-171798692)
Надо работать с unsigned intenger... .
хотя программе и это не помогает. Честно говоря о твоей операции convert (int *i = (int *)&f ) ничего сказать не могу.
Выше правильная прога.
Хочешь сказать что этот вариант у тебя работает правильно??? У меня нет, или я что то не понимаю.
А ты знаешь как выглядит 1.0 с плавающей точкой и двойной точностью??? Если нет, запусти мою прогу. :)
Но можно проверить. Нужно изменить printf в main() на
printf("%.1f = %s %X%X", f, ch, *(int*)&f, *((int*)&f+1));
И она выведет 1.0 в СС16.