进制转换Core code

32 阅读2分钟

反序数:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    int a=0;
    cin>>n;
    while(n>0){
        // a*=10;
        // a+=(n%10); //  %10可得最低位
        a=(a*10) + (n%10);
        n/=10; //  /10可去掉最低位    
    }
    cout<<a; 
    return 0;
}

10进制转x进制(x小于10)

思路:

  • (10进制转2进制)短除法:一直除以2,再反序输出,就是二进制。

  • 核心:模2、除2、模2、除2...

  • 将取模得到的1、0,存入数组中,最后将数组反序输出即可。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    int x=0;
    cin>>n;
    int a[100],cnt=0; 
    while(n>0){ //将n诸位分解
        x=n%2; //若转3进制,则模3,以此类推
        a[cnt++]=x;
        n=n/2; //若转3进制,则除3,以此类推
    }
    for(int i=cnt-1; i>=0; i--){
        cout<<a[i];
    }
    return 0;
}

x大于10 / 10进制转x进制通用版

思路

  • 依然是模k、除k、模k、除k...,但是在上述代码中做一些改动。

  • 存k进制的数组类型应从int型换成char型。数字变成字符需要加'0'。

  • 反序输出。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,k;
    int x=0;
    cin>>n>>k; // 输入10进制n 和 要转换的进制k 
    int cnt=0; // 数组下标 
    char a[100]; // 十进制以上有字符,所以用char存储 
    while(n>0){
        x = n%k;
        if(k<10) a[cnt++] = x+'0'; //数字变字符要+'0' 
        else a[cnt++] = (x-10) +'A'; //大于10的话要-10,对应10是A,11是B。。。若要小写则+'a' 
        n = n/k;
    }
    for(int i=cnt-1;  i>=0; i--){
        cout<<a[i];
    }
    return 0;
}

x进制转10进制(2进制转10进制)

思路 1011转10进制:从高位开始每位乘2的n-1次方,再相加,即为10进制数。

#include<bits/stdc++.h>
using namespace std;
int main(){
    char s[100];
    cin>>s; //输入二进制字符串 
    int ans=0;
    int len=strlen(s); //计算字符串的长度 
    for(int i=0; i<len; i++){
        // if(s[i]=='0') ans = ans*2;
        // else ans = ans*2+1;
        ans = ans*2 + (s[i]-'0'); //简化上两行
    } 
    cout<<ans;
    
    return 0;
}

x进制转10进制通用版

#include<bits/stdc++.h>
using namespace std;
int main(){
    char s[100];
    int x;
    cin>>s>>x; //输入x进制字符串s和进制数x 
    int ans=0;
    int len=strlen(s); //计算字符串的长度 
    for(int i=0; i<len; i++){
        ans=ans*x;
        if(s[i]>='0' && s[i]<='9') ans+=(s[i]-'0'); //将字符转化为数字是-'0'
        else ans = ans+(s[i]-'A')+10; //字符为字母且大于9,A是10,所以-A,再加10,因为是转10进制 
    } 
    cout<<ans;
    return 0;
}

x进制转y进制通用版

思路 x进制转10进制,10进制转y进制。(将以上代码结合)

#include<bits/stdc++.h>
using namespace std;
int main(){
    char s[100];
    int x,y;
    cin>>s>>x>>y; //输入字符串s和代表的进制数x和转换的进制数y
    
    // 先将字符串转换为10进制数 
    int ans=0; //存储10进制数 
    int len=strlen(s);
    for(int i=0; i<len; i++){
        ans*=x;
        if(s[i]>='0' && s[i]<='9') ans+= (s[i]-'0');
        else ans+= (s[i]-'A')+10;//转换为10进制,就+10 
    } 
    //cout<<ans<<endl; //输出10进制数(为了验证上半部分转换是否正确) 
    // 再将10进制数转换为y进制 
    char out[100];
    int cnt=0;
    while(ans>0){
        int k=ans%y;
        if(y<10) out[cnt++] = k+'0'; //数字变字符要+'0'
        else out[cnt++] = (k-10)+'A'; //大于10的话要-10,对应10是A,11是B。。。若要小写则+'a' 
        ans/=y;
    }
    for(int i=cnt-1; i>=0; i--){
        cout<<out[i]<<" ";
    }
    return 0;
}

小结

一些特别小、容易出错的点注意:

  • 单个字符转数字的话是-'0'。 数字转字符是+'0'。

  • 小写转大写是-'a'+'A'。

  • 0-9的ASCII:48-57

  • A-Z的ASCII:65-90

  • a-z的ASCII:97-122

  • 这类题目的核心:数位的拆解与合并拆解:先取模然后除取整。合并:先乘后加

  • 其他稍微复杂的题都是这些代码的基础上进行小变动,万变不离其宗。核心代码要掌握!

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情