整数的进位制

整数的进位制

 

Problem Description

给你一个10进制数,让你处理以下操作:
1.T a。意义为:将当前的数转换成a进制数。
2.A a。意义为:将当前的数加上十进制下的a。
3.M a。意义为:将当前的数减去十进制下的a。
4.C。意义为:将当前的数的最后一位去掉。如果当前的数为0,那么该操作可不处理。
5.G a。意义为:将a连到当前的数的最后一位后面。保证在当前的进制下a这个一位数是存在的。(即,在10进制下保证0<=a<10,依此类推)
6.O。意义为:输出当前的数(在当前的进位制下)。
注意:进制数可能会大于10。如果出现了这种情况,那么从10开始依次用A,B,C,D,……代替。如果大写字母也不够了,那么再使用小写字母。保证英文字母是够用的。同时保证,在操作过程中当前的数不会超过1017,并且始终为正整数。
即,数码的顺序为:
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz。

Input

第一行为操作的个数Q。
第二行为初始的10进制数。
下接Q行,每行一个操作。
Q≤5×105。
这题要用long long int.

Output

对于每个O操作,输出相应的回答。

Sample Input

17
30
T 5
A 8
M 6
A 968
O
C
C
C
T 7
G 6
T 16
G B
O
T 10
O
M 99
O

Sample Output

13000
3EB
1003
904
样例解释:
T 5 num = 110(5)
A 8 num = 123(5)
M 6 num = 112(5)
A 968 num = 13000(5)
O output 13000
C num = 1300(5)
C num = 130(5)
C num = 13(5)
T 7 num = 11(7)
G 6 num = 116(7)
T 16 num = 3E(16)
G B num = 3EB(16)
O output 3EB
T 10 num = 1003(10)
O output 1003
M 99 num = 904(10)
O output 904

解释:

这个题,最多的就是设计到进制改变,设想一下从7进制到11进制的改变,那么以我的知识水平就是先把7进制变为10进制,然后再由10进制变为11进制。这样就会很浪费时间,所以我就只保存一个十进制的数,当需要输出的时候,我就安装相应的进制输出就好。那么对于其他的操作呢,需要安装当前的进制改变数的大小。其实很好做如果是

T 操作,不用改变数的大小。

A 操作,直接加上去就好了

M操作,直接减就好

C操作,先判断是不是0,减掉当前进制下的最后一位,实际上就是 除取整,例如当前数是  res ,  进制是 n ,那就是 res /= n

G操作,也是好做的,因为是把数拼到当前进制下的数字后面,那就是 res *= n, res += a.   不同的是,需要把 a 这个字符转化为10进制下的数,就好了

O操作,就是把一个十进制的数,按照n进制输出。

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 char ress[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 6 
 7 long long int  gfun(long long int res, int bit) {
 8   char str[10];
 9   scanf("%s", str);
10   res *= bit;
11   if (str[0] >= '0' && str[0] <= '9') res += str[0] - '0';
12   if (str[0] >= 'A' && str[0] <= 'Z') res += str[0] - 'A' + 10;
13   if (str[0] >= 'a' && str[0] <= 'z') res += str[0] - 'z' + 36;
14   return res;
15 }
16 
17 void Out(long long int res, int bit) {
18   char ans[1000];
19   int t = 0;
20   if (res == 0) ans[t++] = '0'; 
21   while (res) {
22     ans[t++] =  ress[res % bit];
23     res /= bit;
24   }
25 
26   for (int i = t-1; i >= 0; i--) {
27     putchar(ans[i]);
28   }
29 
30   putchar('\n');
31 }
32 
33 int main () {
34   long long int res, num;
35   int bit, n;
36   char opt[10];
37   while (~scanf("%d", &n)) {
38     bit = 10;
39     scanf("%lld", &res);
40     while (n--) {
41       scanf("%s", opt);
42       switch (opt[0]) {
43         case 'T': scanf("%d", &bit); break;
44         case 'A': scanf("%lld", &num); res += num; break;
45         case 'M': scanf("%lld", &num); res -= num; break;
46         case 'C': if (res) res /= bit; break;
47         case 'G': res = gfun(res, bit); break;
48         case 'O': Out(res, bit); break;
49       }
50     //  printf("res = %lld\n", res);
51     }
52   }
53   return 0;
54 }
View Code

 

posted @ 2019-07-19 09:28  龚政  阅读(381)  评论(0编辑  收藏  举报