P1143 进制转换

Posted fuxyao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1143 进制转换相关的知识,希望对你有一定的参考价值。

大致题意:

  • 给定一个n进制的数,把它转换为m进制的数。

总体思路:

  • 以10进制为中间进制,

  • 把n进制的数转换为10进制,

  • 再转换为m进制,

  • 最后输出。

然后说一说如何进行n进制转10进制10进制转m进制

n进制转10进制

  • 我们有一种方式可以来表示一个n进制数: 将每个阿拉伯数字乘以一个以该数字所处位置为指数,以n为底数的幂之和的形式。例如 233(8) 可表示为 2×82+3×81+3×80 这样的形式。

  • 那么根据这个方式,我们就可以将n进制转换为10进制了。

  • 具体来说,我们从这个数的末尾往前推,以一个t变量表示以该数字所处位置为指数,以n为底数的幂,然后再用一个变量累加每次的乘积,最后就可以得到10进制的这个数了。

  • for(int i=sLen-1;i>=0;--i){//倒推,sLen表示字符串的长度
        num_10+=mp[s[i]]*t;//累加乘积,mp[s[i]]表示s[i]这个字符所代表的数字
        t*=n;//求前一位的“以该数字所处位置为指数,以n为底数的幂”
    }
    

10进制转m进制

  • 10进制转m进制就好办了,以这个数不断模m,模出的数存到数组里,然后除以m,一直到这个数为0之后停止。

  • while(num_10){//不为0不退出
        ans[++tot]=ch[num_10%m];//存到数组里,ch[num_10%n]代表的是取模出来的数的字符(因为类似于11不能直接输出,需要变为字符)
        num_10/=m;//除以m
    }
    
  • 注: 答案应该是将ans数组反过来,因为每次取模的数都应该从后往前放,但是并不知道要放多少个,所以就"正着进去,反着输出"。

Code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
using namespace std;
#define R read()
#define GC getchar()
#define ll long long
#define ull unsigned long long
#define INF 0x7fffffff
#define LLINF 0x7fffffffffffffff
ll read(){
    ll s=0,f=1;
    char c=GC;
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-f;c=GC;}
    while(c>=‘0‘&&c<=‘9‘){s=s*10+c-‘0‘;c=GC;}
    return s*f;
}
int n,m;
string s;
int sLen;
int num_10,t=1;//nun_10是存放10进制数的变量,t是"以该数字所处位置为指数,以n为底数的幂"
char ch[20]={‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘};
map<char,int> mp;
char ans[100010];//记录答案的数组
int tot;
int main(){
    for(int i=0;i<16;++i){
        mp[ch[i]]=i;
    }
    cin>>n>>s>>m;
    sLen=s.length();
    //n进制转10进制
    for(int i=sLen-1;i>=0;--i){//倒推,sLen表示字符串的长度
        num_10+=mp[s[i]]*t;//累加乘积,mp[s[i]]表示s[i]这个字符所代表的数字
        t*=n;//求前一位的“以该数字所处位置为指数,以n为底数的幂”
    }
    //10进制转m进制
    while(num_10){//不为0不退出
        ans[++tot]=ch[num_10%m];//存到数组里,ch[num_10%n]代表的是取模出来的数的字符(因为类似于11不能直接输出,需要变为字符)
        num_10/=m;//除以m
    }
    for(int i=tot;i>=1;--i){//倒着输出
        printf("%c",ans[i]);
    }
    return 0;
}

以上是关于P1143 进制转换的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1143 进制转换

P1143 进制转换

P1143 进制转换

P1143 进制转换

P1143 进制转换

洛谷P1143 进制转换