蓝桥杯专题---进制转换题

    科技2024-02-02  116

    一、十六进制转十进制

    二、十进制转十六进制

    三、十六进制转八进制

    一、十六进制转十进制

    解题思路:

    任意进制转十进制 void revd(int n,int d){ ll y = 0,p = 1; while(n != 0){ y += (n%10) * d; n /= 10; p *= d; } cout<<y; }

    2.注意:累加要防止爆int,用long long型 3.十六进制有字母有数字,分类转换对应的数字大小

    代码如下:

    #include<iostream> #include<string> using namespace std; #define ll long long string s; void revd(int d){ ll y = 0, p = 1; for(int i = s.size() - 1; i >= 0 ; i -- ){ int t; if(isdigit(s[i])){ t = s[i] - '0'; }else{ t = s[i] - 'A' + 10; } y += t * p; p *= d; } cout << y; } int main(){ cin >> s; revd(16); return 0; }

    二、十进制转十六进制

    解题思路:

    1.十进制转换为任意进制

    void revd(int n,int d){ int z[40],num = 0; do{ z[num ++] = n%d; n/=d; }while(n != 0); for(int i = num - 1; i >= 0; i -- ){ cout<<z[i]; } }

    代码如下:

    #include<iostream> #include<string> using namespace std; #define ll long long char str[] = {"0123456789ABCDEF"}; int n; string s; void revd(int d){ int y = n; do{ s += str[y%d]; y /= d; }while(y != 0); for(int i = s.size() - 1; i >= 0; i -- ){ cout<<s[i]; } } int main(){ cin >> n; revd(16); return 0; }

    三、十六进制转八进制

    解题思路:

    每个十六进制数长度不超过100000

    可以推断出:并不能转换为十进制再转换为八进制那么,先转换为二进制再转换为八进制,从低位到高位存储 //从低位到高位存储 int len_s = s.size() - 1; for(int i = 0; i <= len_s; i ++ ){ a[i] = s[len_s - i]; } 十六转换为二进制,可以转换4位数的二进制数字 int len_b = 0,len_res = 0; for(int i = 0; i <= len_s; i ++ ){ int t; if(isdigit(a[i])){ t = a[i] - '0'; }else{ t = a[i] - 'A' + 10; } for(int j = 0; j < 4; j ++ ){ b[++len_b] = (t >> j) & 1; } } 二进制转换为八进制,小数点从左到右,每3位的和为一个数字 for(int i = 1; i <= len_b - len_c; i += 3){ int t = 0; for(int j = 0; j < 3; j ++){ t += bits[j] * b[i + j]; } res[++len_res] = t; } 多余的部分,另外计算到前面,最后答案去掉前导0 while(res[len_res] == 0){ --len_res; } 从高位到低位输出 for(int i = len_res; i >= 1; i -- ){ cout<<res[i]; }

    代码如下:

    #include<iostream> #include<cstring> using namespace std; const int N = 1e6 + 10; #define mm(a,x) memset(a,x,sizeof a) char a[N]; int b[N],res[N]; int bits[] = {1,2,4}; int n; string s; int main(){ cin >> n; while(n -- ){ cin >> s; mm(a,0);mm(b,0);mm(res,0); //从低位到高位存储 int len_s = s.size() - 1; for(int i = 0; i <= len_s; i ++ ){ a[i] = s[len_s - i]; } //转换为二进制 int len_b = 0,len_res = 0; for(int i = 0; i <= len_s; i ++ ){ int t; if(isdigit(a[i])){ t = a[i] - '0'; }else{ t = a[i] - 'A' + 10; } for(int j = 0; j < 4; j ++ ){ b[++len_b] = (t >> j) & 1; } } int len_c = len_b%3; for(int i = 1; i <= len_b - len_c; i += 3){ int t = 0; for(int j = 0; j < 3; j ++){ t += bits[j] * b[i + j]; } res[++len_res] = t; } if(len_c == 1){ res[++len_res] = bits[0] * b[len_b]; }else if(len_c == 2){ res[++len_res] = bits[0] * b[len_b - 1] + bits[1] * b[len_b]; } while(res[len_res] == 0){ --len_res; } for(int i = len_res; i >= 1; i -- ){ cout<<res[i]; } puts(""); } return 0; }
    Processed: 0.012, SQL: 8