m进制数转十进制数和十进制数转m进制数(m<=16)

m进制数转十进制数(乘权取余法)

#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int n,m;
    int ans=0;
    cin>>n>>m;
    for(int i=6;i>=0;i--){
        int a=n/pow(10,i);   //1式
        int b=n/pow(10,i+1);  //2式
        int c=pow(m,i);      // 3式
        ans+=(a-b*10)*c;         //4式
    }
    cout<<ans<<endl;
    return 0;   
}

1~4式主要是为了单步调试方便,可以写成一步。
但这只对于10进制以内的数转为十进制数有作用。比如16进制中单位存在A~F用int型则不能准确表示了。
为适应更高数制,修正后的代码如下(当然为了题目要求这里最高数制可以转换到16进制数):

#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main(){
    string n;
    int m;
    int ans=0;
    cin>>n>>m;
    int q=n.size();
    for(int i=0;i<q;i++){
        if(n[i]<=57&&n[i]>=48)
            ans+=(n[i]-48)*pow(m,q-i-1);
        if(n[i]<=70&&n[i]>=65)
            ans+=(n[i]-55)*pow(m,q-i-1);
        if(n[i]<=102&&n[i]>=97)
            ans+=(n[i]-87)*pow(m,q-i-1);
    }
    cout<<ans<<endl;
    return 0;   
}

十进制数转m进制数(反向取余法)

#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main(){
    int n,m;
    cin>>n>>m;
    char num[100];
    int res=n,i=0,cnt,p;
    while(res!=0){
        res=n/m;
        p=n%m;
        if(p==10)num[i++]='A';
        else if(p==11)num[i++]='B';
        else if(p==12)num[i++]='C';
        else if(p==13)num[i++]='D';
        else if(p==14)num[i++]='E';
        else if(p==15)num[i++]='F';
        else num[i++]=p+48;
        n=res;
    }
    cnt=i;
    for(i=cnt-1;i>=0;i--)
        cout<<num[i];
    cout<<endl;
    return 0;   
}

猜你喜欢

转载自blog.csdn.net/weifuliu/article/details/78866017