整数的进位制
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。
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.
第二行为初始的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(' '); 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 ", res); 51 } 52 } 53 return 0; 54 }