关于进制之间的转化

一下所说的内容与代码结合一起
代码可以运行
可以自己加个while循环来查询
所以...

就先看看代码?

#include<bits/stdc++.h>
using namespace std;
int qpow(int b,int p) {
    int a = 1;
    while(p > 0) {if(p & 1)a *= b;b *= b;p >>= 1;} return a;
}
//一下处理涉及超过一位的数(比如10)的转化
//也就是用map来回映射一下,方便对字符串的操作而已
//10 -> A     B -> 11
map<int,char>over;
map<char,int>revo;
void intt() {
    for(int i = 0;i <= 9;++ i) over[i] = i+'0';
    for(int i = 10;i <= 15;++ i) over[i] = 'A'+i-10;
    for(int i = 0;i <= 9;++ i) revo[i+'0'] = i;
    for(int i = 10;i <= 15;++ i) revo[over[i]] = i;
}
//十进制转其它进制
string zh1(int a,int b) {
    string c;
    while(a) c += over[a%b],a /= b;//反复模和除,记录余数
    reverse(c.begin(),c.end());//把得到的字符串反转
    return c;
}
//其它进制转十进制
int zh2(string a,int b) {
    int ten=0;
    for(int i = a.size()-1;i >= 0;-- i) 
        ten += revo[a[i]]*qpow(b,a.size()-i-1);
    return ten;
}
//其它进制转其它进制
string from_to(string a,int b,int c) {
    int ten = zh2(a,b);//先转化到十进制
    string to = zh1(ten,c);//再转化到想要的进制
    return to;
}
int main() {
    intt();//预处理
    //十进制转化为其它进制
    int a,b;
    cin>>a>>b;
    cout<<zh1(a,b)<<'\n';
    //其它进制转化为十进制
    string Aa; int Bb;
    cin>>Aa>>Bb;
    cout<<zh2(Aa,Bb)<<'\n';
    //其它进制转化为其它进制
    string A; int B,C;
    cin>>A>>B>>C;//当前这个数,当前的进制,要转化到的进制
    cout<<from_to(A,B,C)<<'\n';
return 0;
}

自己把自己恶心到了,所以后面的不要看了

#include<bits/stdc++.h>
using namespace std;
//快速幂模板,不想用cmath的...
int qpow(int b , int p) {
  int a = 1;
  while(p > 0) {if(p & 1)a *= b ; b *= b ; p >>= 1;} return a;
}
//一下处理涉及超过一位的数(比如10)的转化
//也就是用map来回映射一下,方便对字符串的操作而已
//10 -> A   B -> 11
map< int , char > over;
map< char , int > revo;
void intt() {
  for(int i = 0 ; i <= 9 ; ++i) over[i] = i + '0';
  for(int i = 10 ; i <= 15 ; ++i) over[i] = 'A' + i - 10;
  for(int i = 0 ; i <= 9 ; ++i) revo[i + '0'] = i;
  for(int i = 10 ; i <= 15 ; ++i) revo[over[i]] = i;
}
//十进制转其它进制
string tento_other(int ten_base_num , int to_base) {
  string other_base_num;
  while(ten_base_num) {//反复模和除,记录余数
	other_base_num += over[ten_base_num % to_base];//这比写个三目或者if判断好使吧
	ten_base_num /= to_base;
  }
  reverse(other_base_num.begin() , other_base_num.end());//把得到的字符串反转(如果你一定要用递归写就当我没说)
  return other_base_num;
}
//其它进制转十进制
int otherto_Ten(string any_base_num , int what_base) {
  int TEN=0;
  for(int i = any_base_num.size()-1 ; i >= 0 ; --i) {
    TEN += revo[any_base_num[i]] * qpow(what_base , any_base_num.size() - i - 1);
  }
  return TEN;
}
//其它进制转其它进制
string from_to(string now_base_num , int now_base , int to_base) {
  int Ten_base_num = otherto_Ten(now_base_num , now_base);//先转化到十进制
  string to_base_num = tento_other(Ten_base_num , to_base);//再转化到想要的进制
  return to_base_num;
}
int main() {
  intt();//预处理
  //十进制转化为其它进制
  int ten_base_num , to_base;
    cin >> ten_base_num >> to_base;//一个十进制的数,要转化到的进制
      cout<<tento_other(ten_base_num , to_base) << endl;
  //其它进制转化为十进制
  string any_base_num;
  int what_base;
    cin >> any_base_num >> what_base;//一个任意进制的数,它的进制
      cout << otherto_Ten(any_base_num , what_base ) << endl;
  //其它进制转化为其它进制
  string now_base_num;
  int now_base;
    cin >> now_base_num >> now_base >> to_base;//当前这个数,当前的进制,要转化到的进制
      cout << from_to(now_base_num , now_base , to_base) << endl;
return 0;
}

END...

posted @ 2021-11-28 16:31  双枫  阅读(47)  评论(1编辑  收藏  举报