Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstring>
- using namespace std;
- const int MAX_LEN = 150; // максимальная длина числа
- char s[MAX_LEN]; // строка для исходного числа
- //a - исходное число, c - временный массив, для храниния частного, res - ответ
- int a[MAX_LEN], c[MAX_LEN], res[MAX_LEN*2];
- //osn1- система счисления, n- длина исходного числа, ans_len - длина ответа
- int osn1,n,ans_len;
- //преобразование символа в число в десятичной системе счисления
- int chislo(char x)
- {
- if ( (int)(x-'0')>=0 && (int)(x-'0')<10)
- return (int)(x-'0');
- else return (int)(x-'A')+10;
- }
- int main()
- {
- //вводим число строкой и систему счисления
- scanf("%s%d", s, &osn1);
- n=strlen(s);
- //преобразуем строку в массив
- for (int i=0; i<n; i++)
- {
- a[i] = chislo(s[i]);
- //если число выходит за рамки -> Ошибка
- if ( a[i] >= osn1)
- {
- printf("Ошибка");
- return 0;
- }
- }
- ans_len=0;
- do
- {
- // ost- остаток от деления данного числа, m - длина частного, j- счетчик
- int ost=0, m=0, j=0;
- //моделируем первое действие деления в столбик: ищем число, большее k
- while (j<n && ost*osn1+a[j]<10)
- {
- ost = ost*osn1 + a[j];
- j++;
- }
- //если число меньше 10 -> записываем в ответ и выходим
- if (j == n)
- {
- res[ans_len++]=ost;
- break;
- }
- //моделируем деление в osn1-ричной системе счисления, сохраняя результат деления во временный массив
- for (int i=j; i<n; i++)
- {
- ost = ost*osn1 + a[i];
- if ( ost >= 10)
- {
- c[m++] = ost/10;
- ost %= 10;
- }
- else c[m++]=0;
- }
- //сохраняем промежуточный результат в основной массив
- for (int i=0; i<m; i++)
- a[i]=c[i];
- n=m;
- //сохраняем остаток в ответ
- res[ans_len++] = ost;
- }while (1==1);
- //ответом являются остатки от деления записанные в обратном порядке
- for (int i=ans_len-1; i>=0; i--)
- printf("%d", res[i]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment