题目1118:数制转换
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:2468
解决:941
-
题目描述:
-
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。
-
输入:
-
输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
数据可能存在包含前导零的情况。
-
输出:
-
可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(0,1,...,9,A,B,...,F)。
-
样例输入:
-
15 Aab3 7
-
样例输出:
-
210306
-
提示:
-
可以用字符串表示不同进制的整数。
-
来源:
- 2008年北京大学图形实验室计算机研究生机试真题
-
- c++代码:
-
//1118 数制转换 #include<cstdio> #include<cctype> #include<cstring> #include<iostream> #include<memory.h> using namespace std; typedef long long LL; const int MAX = 50; int ctoint(char c)//A-F转化为对应的数字 { if(c>='0' && c<='9') return c-'0'; else { return tolower(c)-'a' +10; } } inline void swap(int &x, int &y) { int t = x; x = y; y = t; } struct node { int arr[MAX]; int len;//该进制下长度 int numsys;//当前进制 int target; //构造函数 node(char str[], int t, int p)//str数据 t进制形式输入 { memset(arr, 0, sizeof(arr)); len = strlen(str); numsys = t; target = p; for(int st=0; st<len; ++st) { arr[st] = ctoint(str[st]); } } //消除前导零 bool delPreZero() { bool flag = true; int zeN = 0; for(int i=0; i<len; ++i) { if(flag && arr[i]==0) { ++zeN; } else { flag = false; break; } } revArr(); if(zeN>0) len -= zeN; if(len == 0) return 1; return 0; } //逆置 void revArr() { for(int i=0; i<len/2; ++i) { swap(arr[i],arr[len-i-1]); } } //转化为十进制 LL transToTen() { int carry = 0; int i; LL ret= 0; for(i=len-1; i>=0; i--) { ret = ret*numsys + arr[i]; } return ret; } //10进制转化为t进制 void transToT()//t为转变后的进制 { LL tInt = transToTen(); // printf("%lld\n",tInt); int i = 0; while(tInt>0) { arr[i++] = tInt%target; tInt /= target; } len = i; } //打印 void nPrint() { int i; for(i=len-1; i>=0; i--) { if(arr[i]<=9 && arr[i]>=0) printf("%d",arr[i]); else printf("%c",(arr[i]-10)+'A'); } printf("\n"); } }; int main(void) { int a,b; char strs[MAX]; while(~scanf("%d%s%d",&a, strs, &b)) { node ini = node(strs,a,b);//构造 if(ini.delPreZero())//000的情况 消除前导零 { printf("0\n"); continue; } ini.transToT();//转为b进制 ini.nPrint();//打印 } return 0; }
PS:程序较繁琐,可以在读入的时候直接加转换为十进制数,然后循环除法。