М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
IhaveAbrains
IhaveAbrains
28.03.2021 09:48 •  Информатика

Написать рекурсивную процедуру, переводящую числа из одной системы счисления в другую. (язык c++)

👇
Ответ:
lizaant
lizaant
28.03.2021
#include <iostream>
#include <iomanip>
using namespace std;

// перевод из основания frm в основание 10
void snd(int frm,int* n,char s[]) {
   int m,p;
   m=strlen(s); 
   if (m>0) {
      if (s[m-1]<58) p=s[m-1]-48;      
      else  p=s[m-1]-'a'+10;   
      s[m-1]=0; snd(frm,n,s);
   } 
   else p=0;
   *n=*n*frm+p;
}

// перевод числа n из основания 10 в to
void dsn(int* n,int to,char s[]) {
   static int k=0;
   int m;
   m=*n%to; *n/=to;  k++;
   if (*n>0) dsn(n,to,s);
   else { s[k]=0; k=0; }
   if (m<10) s[k]=m+48;
   else s[k]=m+'a'-10;
   k++;
}  

int main() {
  
  int osns,osnd;
  int n=0;
  char s[30];
  cout<<"from osn: "; cin>>osns;
  cout<<"number: "; cin>>s; 
  cout<<"to osn: ";  cin>>osnd;
  snd(osns,&n,s);
  dsn(&n,osnd,s);
  cout<<s<<endl;
  system("pause");
  return 0;
}

from osn: 5
number: 13211
to osn: 16
420

from osn: 16
number: 2f3de
no osn: 6
4051502
4,6(74 оценок)
Открыть все ответы
Ответ:
toktogulovadanna77
toktogulovadanna77
28.03.2021
Для перевода чисел в дополнительный код, нужно:
1) перевести в двоичную систему счисления
0000 1101            13
0000 0111             7
2) инвертировать (заменить 0 на 1 и наоборот)
1111 0010
1111 1000
3) и прибавить 1
1111 0011
1111 1001
все)
числа в дополнительном коде мы получили

теперь сложение:
   1111 0011
   1111 1001 +
1 1110 1100
мы получили переполнение и единицу в старшем разряде, это значит, сумма будет со знаком минус
теперь переведем сумму в обычный код, не трогаем старший бит
1) _001 0011 инвертируем биты
2) _001 0100 прибавим 1
3) переводим в десятичную систему счисления:
2^{2}+ 2^{4} = 20

вспоминаем, что сумма отрицательная, поэтому ответ будет: -20
------------
для положительных чисел нужно перевести в двоичную систему
Например:
2 + 3
0000 0010 - 2
0000 0011 - 3
и сложить
0000 0101 - 2^{2} + 2^{1} = 2 + 4 = 6
у положительных дополнительный код совпадает с прямым кодом
4,7(79 оценок)
Ответ:
lex9090
lex9090
28.03.2021
N=8 в задании, насколько я понимаю, означает решение для восьмибитного представления данных, т.е. для случай, когда левый бит отводится под знак (0 - плюс, 1 - минус), а семь правых битов используются для представления числа.
Отрицательное число представляется в дополнительном коде, т.е. нули заменяются единицами (и единицы - нулями), а потом в младшем разряде к полученному числу прибавляется единица.
Вначале перевод.
-13(10)=-0001101(2)
Инвертируем биты: 1110010
Прибавляем единицу: 1110011
И дописываем слева 1 в качестве знака. 1 1110011
Аналогичным образом поступаем и с числом -7:
-7(10)=-0000111(2)
Инвертируем биты: 1111000
Прибавляем единицу: 1111001
И дописываем слева 1 в качестве знака. 1 1111001
Теперь сложение. Выполняем его в столбик для всех восьми бит.
   11110011
+ 11111001
 
   11101100
У нас при сложении появилась единица переноса из левого разряда, но дальше уже разрядов нет и она просто отбрасывается.
Результат получился с единичным знаковым разрядом. Поэтому для получения величины результата поступаем в обратном порядке: отделяем семь правых бит, вычитаем единицу и снова инвертируем полученное значение. Вместо единичного знакового разряда приписываем числу знак минус.
1101100 - 1 = 1101011. Инверсия: 0010100, результат -10100(2)=-20(10)
4,5(59 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ