《算法笔记》3.5小节——入门模拟->进制转换 问题 B: 数制转换
程序员文章站
2024-03-18 18:07:28
...
题目描述
求任意两个不同进制非负整数的转换(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)。
样例输入 Copy
4 123 10
样例输出 Copy
27
提示
用字符串存储和表示不同进制的数。
代码
初出茅庐,请多指教!
#include<stdio.h>
#include<string.h>
int main(){
char num[200];
int a,b;
while(scanf("%d%s%d",&a,num,&b)!=EOF){
if(num[0]=='-'){
printf("n can not be negative!\n");
break;
}
if(a<2||a>16||b<2||b>16){
printf("a or b error!\n");
break;
}
//将n[]转为10进制数
int len=strlen(num);
long c=0;
int product=1;
for(int i=len-1;i>=0;i--){
if(num[i]>='0'&&num[i]<='9'){
c=c+(num[i]-'0')*product;
product=product*a;
}
else if(num[i]>='a'&&num[i]<='f'){
c=c+(num[i]-'a'+10)*product;
product=product*a;
}
else if(num[i]>='A'&&num[i]<='F'){
c=c+(num[i]-'A'+10)*product;
product=product*a;
}
}
//printf("c=%ld\n",c);
//将y转为b进制数
char m[200];
int nm=0;
do{
if(c%b<=9){
m[nm++]=c%b+'0';
}
else m[nm++]=c%b-10+'A';
c=c/b;
}while(c!=0);
for(int i=nm-1;i>=0;i--){
printf("%c",m[i]);
}
printf("\n");
}
return 0;
}
上一篇: C++之文件输入输出
下一篇: C语言 文件输入输出