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 进制转换的主要内容,如果未能解决你的问题,请参考以下文章