аче всмысле
0 / 0 / 0
Регистрация: 26.12.2020
Сообщений: 24
1

Создать программу для умножения двух чисел в позиционной системе счисления

08.01.2021, 23:00. Показов 1909. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создать программу для умножения двух чисел в позиционной системе счисления, не прибегая счету в десятичной системе счисления в явном виде.
Помогите, пожалуйста
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2021, 23:00
Ответы с готовыми решениями:

Программа для умножения 2 чисел в 2 системе счисления (нужны комментарии)
добавьте комментариев к программе , а то не понимаю что к чему #include <string> #include...

Составить программу,которая печатает таблицу умножения и сложения натуральных чисел в шестнадцатеричной системе счисления
Составить программу,которая печатает таблицу умножения и сложения натуральных чисел в...

Составить программу, которая печатает таблицу умножения и сложения натуральных чисел в десятичной системе счисления
Составить программу, которая печатает таблицу умножения и сложения натуральных чисел в десятичной...

Составить программу, которая печатает таблицу умножения и сложения натуральных чисел в десятичной системе счисления
Составить программу на Паскале, которая печатает таблицу умножения и сложения натуральных чисел в...

4
5077 / 2649 / 2349
Регистрация: 10.12.2014
Сообщений: 10,026
09.01.2021, 09:42 2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
function Examen(var s : String) : Boolean;
var
  i : Integer;
begin
  while (s[1] = '0') and (Length(s) > 1) do Delete(s, 1, 1);
  if Length(s) = 0 then begin Examen := False; Exit; end;
  for i := 1 to Length(s) do if Not(s[i] in ['0'..'9']) then begin Examen := False; Exit; end;
  Examen := True;
end;
 
function Mul10(a : String) : String;
begin
  if a = '0' then begin Mul10 := '0'; Exit; end;
  Mul10 := a + '0';
end;
 
function MulN(a : String; b : Char) : String;
var
  i, n, p : Integer;
  r : String;
begin
  if (a = '0') or (b = '0') then begin MulN := '0'; Exit; end;
  n := Ord(b) - Ord('0');
  p := 0;
  r := '';
  for i := Length(a) downto 1 do
    begin
      p := p + (Ord(a[i]) - Ord('0')) * n;
      r := Chr(Ord('0') + p mod 10) + r;
      p := p div 10;
    end;
  if p > 0 then
    r := Chr(Ord('0') + p) + r;
  MulN := r;
end;
 
function Add(a, b : String) : String;
var
  i, p : Integer;
begin
  while Length(a) < Length(b) do a := '0' + a;
  while Length(b) < Length(a) do b := '0' + b;
  p := 0;
  for i := Length(a) downto 1 do
    begin
      p := p + Ord(a[i]) + Ord(b[i]) - Ord('0') * 2;
      a[i] := Chr(Ord('0') + p mod 10);
      p := p div 10;
    end;
  if p > 0 then
    a := Chr(Ord('0') + p) + a;
  Add := a;
end;
 
function Mul(a, b : String) : String;
var
  r, d : String;
  i : Integer;
begin
  if (a = '0') or (b = '0') then begin Mul := '0'; Exit; end;
  if a = '1' then begin Mul := b; Exit; end;
  if b = '1' then begin Mul := a; Exit; end;
  r := '0';
  for i := 1 to Length(b) do
    begin
      r := Mul10(r);
      d := MulN(a, b[i]);
      r := Add(r, d);
    end;
  Mul := r;
end;
 
var
  a, b, c : String;
begin
  Write('a: '); ReadLn(a); if Not Examen(a) then begin WriteLn('не целое число'); Halt; end;
  Write('b: '); ReadLn(b); if Not Examen(b) then begin WriteLn('не целое число'); Halt; end;
  c := Mul(a, b);
  WriteLn('c: ', c);
end.
1
Модератор
9855 / 5225 / 3304
Регистрация: 17.08.2012
Сообщений: 15,986
09.01.2021, 10:46 3
JuriiMW, вполне возможно, что программа не соответствует заданию.

В задании есть намёк, что требуется перемножать числа, не переводя их в позиционную систему с основанием 10. Возможно, что weeb забыл указать, что основание позиционной системы счисления не обязательно равно 10.

И ещё нигде в задании не написано, что за числа перемножаются: целые, вещественные с фиксированной точкой или вещественные с плавающей точкой.
1
аче всмысле
0 / 0 / 0
Регистрация: 26.12.2020
Сообщений: 24
09.01.2021, 12:09  [ТС] 4
Извиняюсь. Умножение двух целых чисел в позиционной системе счисления с произвольным основанием
0
Модератор
9855 / 5225 / 3304
Регистрация: 17.08.2012
Сообщений: 15,986
10.01.2021, 04:54 5
Лучший ответ Сообщение было отмечено weeb как решение

Решение

Для целых чисел не длиннее 254 разрядов с основанием системы счисления от 2 до 36:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
const
  dig = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; //цифры
 
type
  num = array[1..512] of word; //тип-массив для числа
 
//Процедура: ввод числа, проверка числа, разделение знака и модуля числа
//s: приглашение
//z: знак числа, если отрицательное, то z = true
//t: модулшь числа
//len: длина модуля числа
//cc: основание системы счисления
procedure Read_Q(s: string; var z: boolean; var t: num; var len: integer; cc: integer);
var
  i: integer; //счётчик
  x: string; //буфер для ввода числа
begin
  repeat //*** цикл ввода числа
    writeln(s); //печатаем приглашение
    readln(x); //вводим число
    for i := 1 to length(x) do if x[i] in ['a'..'z'] then dec(x[i], ord('a') - ord('A')); //приведение букв к верхнему регистру
    i := length(x);
    while (i > 0) and (pos(x[i], dig) in [1..cc]) do dec(i); //проверка цифр
    z := false; //знак пока "+"
    if i = 1 then //если первый символ не цифра, то
      begin
        z := x[i] = '-'; //если первый символ "-", то число отрицательное
        if x[i] in ['+', '-'] then delete(x, 1, 1) else x := '' //если первый символ "+" или "-", удаляем его, иначе стираем число
      end
    else if i > 1 then x := ''; //если не цифровых символов более одного, то удаляем число
    if length(x) = 0 then writeln('Неверный формат числа, повторите ввод.') //если число не введено, печатаем сообщение
  until length(x) > 0; //*** повторяем до тех пор, пока число не будет введено
  len := length(x); //вычисляем длину модуля числа
  for i := len downto 1 do t[len-i+1] := pos(x[i], dig) - 1 //переносим модуль числа из буфера в переменную
end;
 
//Процедура печати числа
//s: сообщение
//z: знак числа
//t: модуль числа
//len: длина модуля числа
procedure Prn(s: string; const z: boolean; const t: num; const len: integer);
var
  i: integer; //счётчик
begin
  writeln(s); //печатаем сообщение
  if z then write('-'); //если число отрицательное, печатаем "-"
  for i := len downto 1 do write(dig[t[i]+1]); //печатаем цифры модуля числа
  writeln; //переход на новую строку
end;
 
//основная программа
var
  c, ce, i, j, k: integer; //система счисления, перенос, счётчики
  m, n, s, p: num; //модули первого и второго сомножителей, результата, произведения первого сомножителя на один разряд второго сомножителя
  mlen, nlen, slen, plen: integer; //длины вышеперечисленных модулей чисел
  zm, zn, zs: boolean; //знаки сомножителей и результата
begin
  repeat //ввод основания системы счисления с проверкой
    write('Введите основание системы счисления [2..', length(dig), ']: ');
    readln(c)
  until c in [2..length(dig)];
  Read_Q('Введите первый сомножитель:', zm, m, mlen, c); //ввод сомножителей
  Read_Q('Введите второй сомножитель:', zn, n, nlen, c);
  zs := zm xor zn; //вычисление знака произведения
  for i := 1 to nlen do //цикл по цифрам второго сомножителя
    begin
      if n[i] > 0 then //если цифра > 0, то
        begin
          for j := 1 to mlen do p[j] := m[j]; //копируем первый сомножитель в произведение
          plen := mlen; //длина произведения пока равна длине первого сомножителя
          if n[i] > 1 then //если цифра > 1, то
            begin //перемножаем первый сомножитель на цифру второго сомножителя
              ce := 0; //перенос пока = 0
              for j := 1 to mlen do //цикл по цифрам второго сомножителя
                begin
                  p[j] := p[j] * n[i] + ce; //умножаем цифру первого сомножителя на цифру второго сомножителя
                  ce := p[j] div c; //новый перенос
                  p[j] := p[j] mod c //коррекция цифры
                end;
              if ce > 0 then //если после умножения всё ещё есть перенос, то распространяем перенос
                begin
                  inc(plen); //увеличиваем длину результата на 1
                  p[plen] := ce //добавляем перенос
                end
            end;
          for j := 1 to plen do //добавляем полученное произведение к результату (со сдвигами по цифрам)
            begin
              k := j + i - 1; //сдвинутая позиция
              inc(s[k], p[j]); //складываем результат и полученное произведение
              if s[k] >= c then //распространяем перенос
                begin
                  dec(s[k], c); //корректируем цифру
                  inc(k); //вычисляем позицию для следующего переноса
                  inc(s[k]) //добавляем перенос
                end
            end;
          if k > slen then slen := k //если перенос распространился за пределы числа, то удлиняем число
        end
    end;
  prn('Результат:', zs, s, slen); //печатаем результат
  readln
end.
Умножение столбиком, как в школе учили. Разбирайтесь.
2
10.01.2021, 04:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2021, 04:54
Помогаю со студенческими работами здесь

Составить программу,которая печатает таблицу умножения и сложения натуральных чисел в десятичной системе счисления на пять
Помагите пожалуйсто написать такую программу: Составить программу,которая печатает таблицу...

Машина Тьюринга: найти сумму двух чисел (в троичной и 10-ной системе счисления) в десятичной системе счисления
Уважаемые умы форума, прошу помочь разобраться с задачей по машине Тьюринга. Даны два положительных...

Составить программу сложения двух чисел в троичной системе счисления
Составить программу сложения двух чисел в троичной системе счисления. Добавлено через 11 часов...

Написать программу, которая находит разность двух чисел в системе счисления с основанием N
Даны два числа в системе счисления с основанием n. Написать программу, которая находит разность...

Составить программу на Паскале для получения таблицы умножения в шестнадцатеричной системе счисления с использованием типа переменной char, оператора Case и функции chr(z1+48) - для получения символьн
Составить программу на Паскале для получения таблицы умножения в шестнадцатеричной системе...

Таблица умножения и сложения натуральных чисел в десятичной системе счисления
Возникли проблемы с написание программы в консоли делфи! нужна помошь!!! Задача: Составить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru