sultan

Perevod

Jul 4th, 2012
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. const int MAX_LEN = 150; // максимальная длина числа
  7.  
  8. char s[MAX_LEN]; // строка для исходного числа
  9.  
  10. //a - исходное число, c - временный массив, для храниния частного, res - ответ
  11. int a[MAX_LEN], c[MAX_LEN], res[MAX_LEN*2];
  12.  
  13. //osn1- система счисления, n- длина исходного числа, ans_len - длина ответа
  14. int osn1,n,ans_len;
  15.  
  16. //преобразование символа в число в десятичной системе счисления
  17. int chislo(char x)
  18. {
  19.     if ( (int)(x-'0')>=0 && (int)(x-'0')<10)
  20.         return (int)(x-'0');
  21.         else return (int)(x-'A')+10;
  22. }
  23.  
  24. int main()
  25. {
  26.     //вводим число строкой и систему счисления
  27.     scanf("%s%d", s, &osn1);
  28.  
  29.     n=strlen(s);
  30.  
  31.     //преобразуем строку в массив
  32.     for (int i=0; i<n; i++)
  33.     {
  34.         a[i] = chislo(s[i]);
  35.  
  36.         //если число выходит за рамки -> Ошибка
  37.         if ( a[i] >= osn1)
  38.         {
  39.             printf("Ошибка");
  40.             return 0;
  41.         }
  42.  
  43.     }
  44.  
  45.     ans_len=0;
  46.  
  47.     do
  48.     {
  49.         // ost- остаток от деления данного числа, m - длина частного, j- счетчик
  50.         int ost=0, m=0, j=0;
  51.  
  52.         //моделируем первое действие деления в столбик: ищем число, большее k
  53.         while (j<n && ost*osn1+a[j]<10)
  54.         {
  55.             ost = ost*osn1 + a[j];
  56.             j++;
  57.         }
  58.  
  59.         //если число меньше 10 -> записываем в ответ и выходим
  60.         if (j == n)
  61.         {
  62.             res[ans_len++]=ost;
  63.             break;
  64.         }
  65.  
  66.         //моделируем деление в osn1-ричной системе счисления, сохраняя результат деления во временный массив
  67.         for (int i=j; i<n; i++)
  68.         {
  69.             ost = ost*osn1 + a[i];
  70.             if ( ost >= 10)
  71.             {
  72.                 c[m++] = ost/10;
  73.                 ost %= 10;
  74.             }
  75.             else c[m++]=0;
  76.         }
  77.  
  78.         //сохраняем промежуточный результат в основной массив
  79.         for (int i=0; i<m; i++)
  80.             a[i]=c[i];
  81.         n=m;
  82.  
  83.         //сохраняем остаток в ответ
  84.         res[ans_len++] = ost;
  85.     }while (1==1);
  86.  
  87.     //ответом являются остатки от деления записанные в обратном порядке
  88.     for (int i=ans_len-1; i>=0; i--)
  89.         printf("%d", res[i]);
  90.     return 0;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment