近来刷题库多次遇到进制转换类型题目,故写此博客,以作总结
进制转换大致分三类:1.n进制转10进制。
2.10进制转n进制。
3.n进制转m进制。
一 . n进制转10进制。
思路:
由于存在11进制到16进制的转换,可能会出现字母,因此使用字符数组,转换大小写后,使用数组储存,算出和。
代码如下:
#include<stdio.h>
int main()
{
char str[100];
int num,n,temp,i;
while(scanf("%s",str)!=EOF)
{
scanf("%d",&n); //n进制
num=0;
for(i=0;str[i];i++)
{
if(str[i]>='a'&&str[i]<='z')
str[i]-=32; //转换大小写
temp=(str[i]>'A'?str[i]-'A'+10:str[i]-'0') ; //算出该位字母对应的值
num=num*n+temp; //求和
}
printf("%d",num);
}
}
二.10进制转n进制
思路:
10进制转换时有固定的代码片,又分为转换成10以内的进制和10以上的进制,通过while循环和趋于配合,使用数组储存每次的值。
代码如下:
#include<stdio.h>
int main()
{
char str[100],str1[100];
int i,j,q,num=0,temp,n;
while(scanf("%s%d",str,&n)!=EOF)
{
for(i=0;str[i];i++)
{
temp=str[i]-'0'; //字符数组转换成int类型
num=num*10+temp;
printf("%d\n",num);
}
i=0;
while(num!=0)
{
q=num%n;
str1[i++]=(q>9?q-10+'A':q+'0'); //将int重新通过ascii码的计算变成字符
num=num/n;
}
puts(str1); //需要倒叙输出,用for循环实现
}
}
三.任意进制的转换
思路:
实际上仍然把十进制当作是一个桥,将n进制转换成10进制,再将10进制转换成m进制
这里发布一个北大研究生机试的题目作为例子:
求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)。
代码如下
#include <stdio.h>
char str[100];
int a,b;
int num,tmp,i;
int main() {
while(scanf("%d%s %d", &a, str, &b) != EOF){
num = 0;
for(i=0; str[i]; i++){
if(str[i] >= 'a') str[i] -= 32;
tmp = (str[i] >= 'A' ? str[i]-'A'+10:str[i]-'0');
//tmp = str[i]
num = num * a + tmp;
}
int cnt=0;
if(num == 0)
{puts("0"); ;}//continue
while(num){
if(num%b <=9)
str[cnt++] = num%b+'0';
else
str[cnt++] = num%b-10+'A';
num = num/b;
}
for(i=cnt-1; i>=0; i--)
printf("%c",str[i]);
puts("");
}
return 0;
}
进制转换问题看起来比较简单,但是涉及到字符数组和数值数组的转化,通过ascii码的加减也是一个不错的选择,还要熟练使用三目运算符(?:),可以使代码更加简练。
flag:每周一更,脚踏实地,无问西东。