OpenJ_Bailian - 2710 B - 数制转换
OJ地址:不同进制的表示符号为(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
15 Aab3 7
Sample Output
210306
思路:
关键在于进制转换的原理理解,寻找转换的规律,下面我们以二进制和十进制为例讲解(其他进制同理):
在了解了进制转换之间的关系后,对本题进行解答分为两步,先把a进制的n转换为10进制的ans,代码如下:
int func(int a,char n[]) { int len = strlen(n); int i,ans=0; for(i=0;i='0'&&n[i]<='9'){ ans=ans+pow(a,len-1-i)*(n[i]-'0'); }else if(n[i]>='a'&&n[i]<='z') { ans=ans+pow(a,len-1-i)*(n[i]-'a'+10); }else { ans=ans+pow(a,len-1-i)*(n[i]-'A'+10); } } return ans;}
再将10进制的ans转换为b进制的arr,代码如下:
void fun(int ans,int b){ char arr[100]; int i,j=0,tmp; while(ans!=0) { tmp = ans%b; if(tmp>=10){ arr[j++]=tmp-10+'A'; }else{ arr[j++]=tmp+'0'; } ans = ans/b; } if(j==0) arr[j++]='0'; for(i=j-1;i>=0;i--){ printf("%c",arr[i]); }}
注意:
当输入值n的为0是,需要特判;
程序代码:
错误:
原因是当输入n为0时候没有输出:
#include#include#include; const int maxn = 10010; int func(int a,char n[]) { int len = strlen(n); int i,ans=0; for(i=0;i='0'&&n[i]<='9'){ ans=ans+pow(a,len-1-i)*(n[i]-'0'); }else if(n[i]>='a'&&n[i]<='z') { ans=ans+pow(a,len-1-i)*(n[i]-'a'+10); }else { ans=ans+pow(a,len-1-i)*(n[i]-'A'+10); } } return ans;}void fun(int ans,int b){ char arr[100]; int i,j=0,tmp; while(ans!=0) { tmp = ans%b; if(tmp>=10){ arr[j++]=tmp-10+'A'; }else{ arr[j++]=tmp+'0'; } ans = ans/b; } for(i=j-1;i>=0;i--){ printf("%c",arr[i]); }}int main(){ int a,b,x=0; char n[maxn]; scanf("%d%s%d",&a,n,&b); x=func(a,n); fun(x,b); printf("\n"); return 0;}
正确:
#include#include#include; const int maxn = 10010; int func(int a,char n[]) { int len = strlen(n); int i,ans=0; for(i=0;i='0'&&n[i]<='9'){ ans=ans+pow(a,len-1-i)*(n[i]-'0'); }else if(n[i]>='a'&&n[i]<='z') { ans=ans+pow(a,len-1-i)*(n[i]-'a'+10); }else { ans=ans+pow(a,len-1-i)*(n[i]-'A'+10); } } return ans;} void fun(int ans,int b){ char arr[100]; int i,j=0,tmp; while(ans!=0) { tmp = ans%b; if(tmp>=10){ arr[j++]=tmp-10+'A'; }else{ arr[j++]=tmp+'0'; } ans = ans/b; } if(j==0) arr[j++]='0'; for(i=j-1;i>=0;i--){ printf("%c",arr[i]); }} int main(){ int a,b,x=0; char n[maxn]; scanf("%d%s%d",&a,n,&b); x=func(a,n); fun(x,b); return 0;}
还可以参考以下代码:
其中使用了ctype.h 提供的isdigit 和 toupper() 函数(isdigit ()函数判断是否为数字,toupper()将小写字母转换为大写字母,此外还有tolower()将大写转为小写)。
#include #include #include using namespace std;string convert(int a, string& s, int b){ long val, dcount, digit; char result[72], c; string ans; val = 0; for(int i=0; i<(int)s.size(); i++) { if(isdigit(s[i])) val = val * a + s[i] - '0'; else val = val * a + toupper(s[i]) - 'A' + 10; } dcount = 0; while(val) { digit = val % b; val /= b; result[dcount++] = ((digit >= 10) ? 'A' - 10 : '0') + digit; } if(dcount == 0) { result[dcount++] = '0'; result[dcount] = '\0'; } else result[dcount] = '\0'; // reverse for(int i=0, j=dcount-1; i> a >> s >> b; cout << convert(a, s, b) << endl; return 0;}
运行结果:
也可以使用:strtol()和itoa()实现:
函数学习请参考:C/C++库函数(strtol()/itoa())进制转换
程序代码:
#include#include#includeconst int maxn = 10010; int main(){ int a,b; char n[maxn]; char *result; scanf("%d%s%d",&a,n,&b); long ret = strtol(n,&result,a); itoa(int(ret),n,b); printf("%s",n); return 0;}
(这个代码在平台上提交不成功,具体原因还未知,如有理解请告知,万分感谢)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~