А.Г. Юркин, "Задачник по программированию". 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");
}