任意进制之间的转换

原创:  

  之前有发一篇进制转换的文章,转换思想在里面,这里不再重复,详情请查看:http://www.cnblogs.com/numen-fan/p/6495009.html

  

题目描述:
    求任意两个不同进制非负整数的转换(2进制~16进制),所给整数在long所能表达的范围之内。
    不同进制的表示符号为(01,...,9,a,b,...,f)或者(01,...,9,A,B,...,F)。
输入:
    输入只有一行,包含三个整数a,n,b。a表示其后的n 是a进制整数,b表示欲将a进制整数n转换成b进制整数。a,b是十进制整数,2 =< a,b <= 16。
    数据可能存在包含前导零的情况。
输出:
    可能有多组测试数据,对于每组数据,输出包含一行,该行有一个整数为转换后的b进制数。输出时字母符号全部用大写表示,即(01,...,9,A,B,...,F)。
样例输入:
15 Aab3 7
样例输出:
210306
提示:
可以用字符串表示不同进制的整数。

代码:

//任何进制的转换

void test3(){

    //输入格式,a,n,b;将a进制的n转为b;

    int a,b;

    char str[40];//保存n

    while (scanf("%d%s%d",&a,str,&b)!=EOF) {

        int tmp = 0,lenth = strlen(str),c=1;//tmp表示将a进制数n转为10进制,len为字符串n的长度,c为权重默认为1,最低位嘛,待会转10进制时使用

        for (int i = lenth-1; i>=0; i--) {

            int x;

            if (str[i]>='0'&&str[i]<='9') {

                x = str[i]-'0';

            }else if(str[i]>='a'&&str[i]<='z'){

                x = str[i]-'a'+10;

            }else if(str[i]>='A'&&str[i]>='Z'){

                x = str[i]-'A'+10;

            }

            tmp+=x*c;//转为10进制,乘权重

            c*=a;//增加权重;

        }

        char ans[40],size = 0;

        do{

            int x = tmp%b;//将10进制转为b进制

            ans[size++] = x<10?x+'0':x-10+'A';//进行结果的装填

            tmp/=b;

        }while(tmp);

//        puts(ans);这里不能这样用,因为ans为正确顺序的倒着的

        for(int i = size-1;i>=0;i--){

            printf("%c",ans[i]);

        }

        printf("\n");

    }

}

 

 
posted @ 2017-03-03 11:34  小小范同学  阅读(2837)  评论(0编辑  收藏  举报