А.Г. Юркин, "Задачник по программированию". 2002 г. ("Юркин задачник")
Часть III. Прикладные математические задачи.
Глава 7. Арифметика. Страница 77, задача 7.1.
Натуральное число в p-ичной системе счисления задано своими цифрами, хранящимися в массиве K (n). Проверить корректность такого представления и перевести число в q-ичную систему (возможно, число слишком велико, чтобы получить его внутреннее представление; кроме того, p ? 10, q ? 10).
Скачать программу, её текст и скриншоты:
yadi.sk/d/4YZGX3LgsyqyX
Программа совместима с MS-DOS, Windows 95, Windows 2000, Windows Vista 32-bit.
Скриншоты:
D:\>cd work
D:\WORK>dir
Volume in drive D has no label
Volume Serial Number is 0C6D-11F0
Directory of D:\WORK
. <DIR> 06-26-16 10:34a .
.. <DIR> 06-26-16 10:34a ..
EGAVGA BGI 5,554 02-18-92 3:00a EGAVGA.BGI
TC BAT 12 06-26-16 10:34a TC.BAT
TCPICK TCP 1,196 07-04-16 1:10p TCPICK.TCP
TCCONFIG TC 1,690 06-26-16 11:03a TCCONFIG.TC
P77 BAK 2,552 07-04-16 1:01p P77.BAK
P77 C 2,720 07-04-16 1:05p P77.C
DONE-1 <DIR> 06-30-16 9:49a DONE-1
P77A C 861 07-01-16 7:40a P77A.C
P77B C 1,800 07-02-16 6:25p P77B.C
P77 OBJ 1,974 07-04-16 1:05p P77.OBJ
P77 EXE 16,907 07-04-16 1:05p P77.EXE
10 file(s) 35,266 bytes
3 dir(s) 104,294,400 bytes free
D:\WORK>
P77 EXE 16,907 07-04-16 1:05p P77.EXE
10 file(s) 35,266 bytes
3 dir(s) 104,294,400 bytes free
D:\WORK>p77
Основание первой системы счисления: 6.
Исходное число:
305003355353403410124202243510302244255011321340001513332510022524343343
Промежуточное число в десятичной системе счисления:
000000000000000055664707093046964168171692001782840499583747901638733679
Основание второй системы счисления: 9.
Конечное число:
24521055280543813208204360708881333086022846352066040662160
D:\WORK>p77
Основание первой системы счисления: 10.
Исходное число:
5226524812744766010775243555714506442709497767068114642959602539897612
Промежуточное число в десятичной системе счисления:
5226524812744766010775243555714506442709497767068114642959602539897612
Основание второй системы счисления: 8.
Конечное число:
140734644037735311255677172054235673252536724056404004567741205054231626221414
Текст программы:
/* p77
Язык Turbo C 2.0
Задачник по программированию
Системы счисления */
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main ()
{
int a [100]; /* исходный массив данных */
int b [100]; /* промежуточный массив данных в десятичной системе счисления */
int c [100]; /* вспомогательный массив данных */
int d [400]; /* целевой массив данных */
int f; /* основание первой системы счисления */
int g; /* основание второй системы счисления */
int h; /* число цифр исходного числа */
int k, l, m, n;
randomize ();
f = rand () % 9 + 2;
g = rand () % 9 + 2;
h = rand () % 100 + 1;
for (k = 0; k < 100; k++) a [k] = b [k] = c [k] = 0;
for (k = 0; k < 400; k++) d [k] = 0;
for (k = 0; k < h; k++) a [k] = b [k] = rand () % f;
printf ("Основание первой системы счисления: %i.\n", f);
printf ("Исходное число:\n");
for (k = h - 1; k >= 0; k--) printf ("%i", a [k]);
printf ("\n");
for (k = 0; k < h - 1; k++)
{
/* Домножаем на основание системы счисления со сдвигом влево */
for (l = 0; l <= k; l++)
c [h - 2 - l] = b [h - 1 - l] * f;
/* Складываем с предыдущим разрядом */
c [h - 2 - k] += b [h - 2 - k];
/* Переносим десятки в следующий разряд */
for (l = k; l >= 0; l--)
{
m = c [h - 2 - l];
c [h - 2 - l] = m % 10;
c [h - 1 - l] += m / 10;
}
/* Переносим данные вверх */
for (l = k; l >= -1; l--)
{
b [h - 2 - l] = c [h - 2 - l];
c [h - 2 - l] = 0;
}
}
printf ("Промежуточное число в десятичной системе счисления:\n");
for (k = h - 1; k >= 0; k--) printf ("%i", b [k]);
printf ("\n");
n = 0; /* указатель в целевом массиве данных на заполняемую ячейку данных */
while (1)
{
l = 0; /* остаток от деления предыдущего разряда */
for (k = 0; k < h; k++)
{
m = l * 10 + b [h - 1 - k];
c [h - 1 - k] = m / g;
l = m % g;
}
d [n++] = l; /* заносим остаток от деления в целевой массив данных */
m = 0;
for (k = 0; k < h; k++) /* переносим результат деления вверх для следующего цикла */
{
b [k] = c [k];
if (b [k]) m = 1; /* флаг наличия ненулевых значений в массиве */
}
if (!m) break; /* расчет окончен */
}
printf ("Основание второй системы счисления: %i.\n", g);
printf ("Конечное число:\n");
for (k = n - 1; k >= 0; k--) printf ("%i", d [k]);
printf ("\n");
getch ();
printf ("\n");
}