算法题----任意进制转换

/*
求任意两个不同进制非负整数的转换(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)。

样例输入4 10 123
样例输出27
 */
#include <bits/stdc++.h>
#include <cstring>
using namespace std;

int toInt(char x)
{
    if(x >= '0' && x <= '9') return x - '0';
    else if( x >= 'a' && x <= 'z') return x - 'a' + 10;
    else return x - 'A' + 10;
}


char toChar(int x)
{
    if( x>=0 && x<=9) return '0' + x;
    else return 'A' + x - 10;
}

int main()
{
     int a, b;  // a为原进制 b要转换的进制
     char s[50];

     while((scanf("%d%d%s", &a,&b,s)) != EOF)
//     scanf("%d%d%s", &a,&b,s);
     {
         int product = 1;  // 进制的幂
         int y = 0;  //存十进制,中间转换
         for(int i = strlen(s) - 1; i>= 0; i--)
         {
             y += toInt(s[i]) * product;
             product = product * a;
         }

         char ans[100];
         int num = 0;

         do{
             ans[num++] = toChar(y % b);
             y = y / b;
         }while(y!=0);

         for(int i = strlen(ans) - 1; i >= 0; i--)
         {
             printf("%c", ans[i]);
         }
         printf("\n");
     }

     return 0;
}

猜你喜欢

转载自www.cnblogs.com/myblog1993/p/11457596.html