1942: 数制转换
- Time Limit: 1 Sec Memory Limit: 32 MB
- Submit: 2738 Solved: 693
- [Submit http://codeup.cn/submitpage.php?id=1942 ][Status http://codeup.cn/problemstatus.php?id=1942 ][web Board http://codeup.cn/bbs.php?pid=1942 ][Creator:Imported]
- Description
求任意两个不同进制非负整数的转换(2 进制~16 进制), 所给整数在 long 所能表达的范围之内.
不同进制的表示符号为 (0,1,...,9,a,b,...,f) 或者(0,1,...,9,A,B,...,F).
Input
输入只有一行, 包含三个整数 a,n,b.a 表示其后的 n 是 a 进制整数, b 表示欲将 a 进制整数 n 转换成 b 进制整数. a,b 是十进制整数, 2 =<a,b <= 16.
Output
可能有多组测试数据, 对于每组数据, 输出包含一行, 该行有一个整数为转换后的 b 进制数. 输出时字母符号全部用大写表示, 即(0,1,...,9,A,B,...,F).
- Sample Input
- 4 123 10
- Sample Output
- 27
- HINT
用字符串存储和表示不同进制的数.
- #include < stdio.h > #include < string.h > int main() {
- int a,
- b;
- char s[40];
- while (scanf("%d %s %d", &a, s, &b) != EOF) {
- int len = strlen(s);
- // 将字符串转换成数值!!!
- for (int i = 0; i < len; i++) {
- if (s[i] >= '0' && s[i] <= '9') s[i] = s[i] - '0';
- if (s[i] >= 'a' && s[i] <= 'f') s[i] = s[i] - 'a' + 10;
- if (s[i] >= 'A' && s[i] <= 'F') s[i] = s[i] - 'A' + 10;
- }
- int sum = 0,
- product = 1;
- for (int i = len - 1; i >= 0; i--) {
- sum = sum + (int) s[i] * product;
- product = product * a;
- }
- int num = 0;
- // 初始化!!!
- memset(s, 0, sizeof(s));
- if (b == 10) {
- printf("%d\n", sum);
- } else {
- // 很奇妙的转化方式!!!
- do {
- if (sum % b < 10) {
- s[num++] = sum % b + '0';
- } else {
- s[num++] = sum % b - 10 + 'A';
- }
- sum /= b;
- } while ( sum != 0 );
- for (int i = num - 1; i >= 0; i--) {
- printf("%c", s[i]);
- }
- printf("\n");
- }
- }
- return 0;
- }
- /*
- // 自己写的
- void outPrintf(int n){
- if(n<10){
- printf("%d", n);
- }else{
- switch(n){
- case 10:
- printf("A");
- break;
- case 11:
- printf("B");
- break;
- case 12:
- printf("C");
- break;
- case 13:
- printf("D");
- break;
- case 14:
- printf("E");
- break;
- case 15:
- printf("F");
- break;
- }
- }
- }
- int changeNum(char c){
- int num;
- if(c=='0'){
- num = 0;
- }else if(c=='1'){
- num = 1;
- }else if(c=='2'){
- num = 2;
- }else if(c=='3'){
- num = 3;
- }else if(c=='4'){
- num = 4;
- }else if(c=='5'){
- num = 5;
- }else if(c=='6'){
- num = 6;
- }else if(c=='7'){
- num = 7;
- }else if(c=='8'){
- num = 8;
- }else if(c=='9'){
- num = 9;
- }else if(c=='a' || c=='A'){
- num = 10;
- }else if(c=='b' || c=='B'){
- num = 11;
- }else if(c=='c' || c=='C'){
- num = 12;
- }else if(c=='d' || c=='D'){
- num = 13;
- }else if(c=='e' || c=='E'){
- num = 14;
- }else{
- num = 15;
- }
- return num;
- }
- void getNum(char s[], int len, int ans[]){
- int num;
- for(int i=0, j=len-1; i<len; i++, j--){
- ans[i] = changeNum(s[j]);
- }
- }
- int main(){
- int a, b;
- char s[40]; //n 不一定全书 0 至 9 之间的数字, 可能出现 a,A 等! 故必须用字串存储
- while(scanf("%d %s %d", &a, s, &b) != EOF){
- int ans[40], num;
- int len = strlen(s);
- getNum(s, len, ans);
- unsigned long long int sum=0, product=1;
- for(int i=0; i<len; i++){
- sum = sum + ans[i] * product;
- product = product * a;
- }
- num = 0;
- do{
- ans[num++] = sum % b;
- sum /= b;
- }while(sum!=0);
- for(int i=num-1; i>=0; i--){
- outPrintf(ans[i]);
- }
- printf("\n");
- }
- return 0;
- }
- */
来源: http://www.bubuko.com/infodetail-3365623.html