进制转换专题

近来刷题库多次遇到进制转换类型题目,故写此博客,以作总结

进制转换大致分三类: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:每周一更,脚踏实地,无问西东。

猜你喜欢

转载自blog.csdn.net/Mikesuper_blog/article/details/81589936