目录

算法进阶进制转换

算法进阶——进制转换

转换的本质:

对于一个十进制的数字,比如说153.其本质是每一数位上的数字乘上这一位上的权重,即:

153=(110^2)+(510^1)+(3*10^0)

对于二进制,只不过把10换成2,任意一个非负整数都有唯一的一个二进制表示:

(153)10=(10011001)2

将任意进制转换为十进制

假设给一个数组来表示一个K进制(假设k>10)的整数,我们该如何得到它的十进制数?

ll x = 0;
for(int i=1;i<=n;i++){
    x=x*k+a[i];
}
cout<<x<<endl;

把十进制转化为任意进制

假设现在有一个十进制的数X,如何转换为k进制?

ll x;
cin>>x;
while (x)
    a[++ cnt] = x%k,x/=k;
reverse(a+1,a+1+cnt);

例题(lanqiao OJ 2489)

问题描述

请问十六进制数 2021ABCD 对应的十进制是多少?

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

#include <iostream>
using namespace std;
typedef long long ll;
const int N=50;
int a[N];

int main()
{
    string s="2021ABCD";
    for(int i=0;i<s.length();++i)
    {
       if('0'<=s[i]&&s[i]<='9')a[i+1]=s[i]-'0';
       else a[i+1]=s[i]-'A'+10;
    }  
     ll x=0;
     for(int i=1;i<=s.length();++i)
      x=x*16+a[i];
      cout<<x<<"\n";
       return 0;
}

例题(lanqiao OJ 2095)

九进制转十进制

问题描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

九进制正整数 (2022)9(2022)9​ 转换成十进制等于多少?

#include <iostream>
using namespace std;
int main()
{
    string s = "2022";
    int ans = 0;
    for(int i=0;i<s.length();i++){
        ans = ans*9+s[i]-'0';
    }
    cout << ans << endl;
    return 0;
}

例题(lanqiao OJ 1230)

进制转换

题目描述

给定一个 NN 进制数 SS,请你将它转换为 MM 进制。

输入描述

第一行为一个整数 TT,表示测试数据数量。 (1≤T≤1051≤T≤105)

每个测试用例包含两行,第一行包含两个整数 N,MN,M。

第二行输入一个字符串 SS,表示 NN 进制数。

数据范围保证:2≤N,M≤162≤N,M≤16,若 N≥10N≥10,则用 A∼FA∼F 表示字码 10∼1510∼15。保证 SS 对应的十进制数的位数不超过 1010。

输出描述

输出共 TT,每行表示一组数据的答案。

输入样例

2
2 10 
10101 
11 2
1793A5068

输出样例

21
10101111001010100111010101011
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;int a[1000];
char ch[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void aa()
{  
  int n,m;string s;
  cin>>n>>m>>s;
  for(int i=0;i<s.size();i++)
  {
    if('0'<=s[i]&&s[i]<='9') a[i]=s[i]-'0';
    else a[i]=s[i]-'A'+10;
  }
 ll x=0;
 for(int i=0;i<s.size();i++)
 {
   x=x*n+a[i];
 } 
 string ss;
 while(x) ss+=ch[x%m],x/=m;
 reverse(ss.begin(),ss.end());
cout<<ss<<endl;
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  int t;
  cin>>t;
  while(t--)
  {
    aa();
  }
  
  return 0;
}