进制转换


小赵常常觉得时间不够用。在学习操作系统和计算机组成原理等课程的时候,经常遇到2进制8进制16进制等需要转换成10进制来方便计算,然后有需要再转换成相应的进制。小赵想不如我来做一个进制转换的程序,非常好做,又可以节省时间。

作为小赵的好朋友,请你来帮他做这件事。

输入

本题有多组测试数据,处理到文件结束。

每组数据首先是两个数字n,m。n代表输入数字的进制,m代表输出数字的进制。(2<=n,m<=62)

接下来一行是一个字符串,表示n进制下的数字。字符串保证表示的值在C语言64位整型(即long long int)范围内。字符串由0~9,a~z,A~Z组成。

a~z标志10到35,A~Z标志36到61。

输出

        每组数据输出一行,用一个字符串表示的转换为m进制之后的值。

样例输入 Copy

10 16
10
10 62
62

样例输出 Copy

a
10

题目大意:就是说给你n进制下的一个字符串转换到m进制
 简单模拟,可以先转为10进制,再由10进制转为m进制。
 坑点:数字0(10 10 0)(就是任意进制下的0,转换到任意进制都是0)
 AC代码
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}
typedef long long ll;
const int maxn = 1e6+10;
char a[maxn];
char b[maxn];
int main()
{
    ll n,m,k;
    char pp='0';
    while(~scanf("%lld%lld",&n,&m)){
        scanf("%s",a);
        ll l=strlen(a);
        if(strcmp(a,"0")==0){
            printf("%c
",pp);
            continue;
        }
        ll sum=0;//输入转化后 
        ll j=0;
        ll p;
        for(int i=l-1;i>=0;i--){
            if(a[i]>='a'&&a[i]<='z'){
                p=a[i]-'a'+10;
            }
            else if(a[i]>='A'&&a[i]<='Z'){
                p=a[i]-'A'+36;
            }
            else{
                p=a[i]-'0';
            }
            sum+=p*pow(n,j);
            j++;
        }
        ll y=0;
        while(sum){
            ll x=sum%m;
            if(x<10){
                b[y++]=(x+'0');
            }
            else if(x>=10&&x<=35){
                b[y++]=(x-10+'a');
            }
            else if(x>=36&&x<=61){
                b[y++]=(x-36+'A');
            }
            sum/=m;
        }
        for(int i=y-1;i>=0;i--){//注意b数组逆序输出 
            printf("%c",b[i]);
        } 
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/lipu123/p/12159174.html