进制转换

1.8进制转16进制
string octs,hexs,t;
void OtoH(){
for(int i=0;i<octs.length();i+=1){
string s=octs.substr(i,1);
if(s=="0")t+="000";
if(s=="1")t+="001";
if(s=="2")t+="010";
if(s=="3")t+="011";
if(s=="4")t+="100";
if(s=="5")t+="101";
if(s=="6")t+="110";
if(s=="7")t+="111";
}
int len=t.length();
for(int i=len;i>=0;i-=4){
string s;
if(i<4){
for(int j=1;j<=4-i;j++){
s+="0";
}
}
s+=t.substr((i-4>=0)?i-4:0,(i<4)?i:4);
// cout<<s<<'\n';
hexs+=mp[s];
}
}
void INIT(){
mp["0000"]="0";
mp["0001"]="1";
mp["0010"]="2";
mp["0011"]="3";
mp["0100"]="4";
mp["0101"]="5";
mp["0110"]="6";
mp["0111"]="7";
mp["1000"]="8";
mp["1001"]="9";
mp["1010"]="A";
mp["1011"]="B";
mp["1100"]="C";
mp["1101"]="D";
mp["1110"]="E";
mp["1111"]="F";
}
2.任意进制转十进制
void moven(string n,int p){
int num=0;
stack<int>s;
if(n=="0")cout<<0;
else{
for(int i=0;i<n.length();i++){
num*=p;
if(n[i]>='0'&&n[i]<='9')num+=n[i]-'0';
else num+=(n[i]-'A'+10);
}
}
cout<<num<<'\n';
}
3.十进制转任意进制
void moven(int n,int p){
stack<int>s;
if(n==0)cout<<0;
else{
while(n){
s.push(n%p);
n/=p;
}
}
while(s.size()){
if(s.top()<10)cout<<s.top();
else cout<<char(s.top()-10+'A');
s.pop();
}
cout<<'\n';
}
4.任意进制转任意进制
int moven(string n,int p){
int num=0;
stack<int>s;
if(n=="0")cout<<0;
else{
for(int i=0;i<n.length();i++){
num*=p;
if(n[i]>='0'&&n[i]<='9')num+=n[i]-'0';
else num+=(n[i]-'A'+10);
}
}
return num;
}
void movem(int n,int p){
stack<int>s;
if(n==0)cout<<0;
else{
while(n){
s.push(n%p);
n/=p;
}
}
while(s.size()){
if(s.top()<10)cout<<s.top();
else cout<<char(s.top()-10+'A');
s.pop();
}
cout<<'\n';
}
move(moven(number,n),m)
5.P2084
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n;string s;
int main(){
cin>>n>>s;int len=s.length();
for(int i=0;i<len;i++){
if(s[i]=='0')continue;
else{
if(i==0)printf("%d*%d^%d",s[i]-'0',n,len-i-1);
else printf("+%d*%d^%d",s[i]-'0',n,len-i-1);
}
}
return 0;
}
解题思路:
比较简单的一道题,直接遍历输出即可
6.P1143
代码:
#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int n,m,ten=0;
string s;
int ntoten(int n,string s){
int len=s.length(),ans=0;
for(int i=len-1;i>=0;i--){
if(s[i]>='A'&&s[i]<='F'){
ans+=(s[i]-'A'+10)*(int)(pow(n,len-i-1));
}else if(s[i]>='0'&&s[i]<='9'){
ans+=(s[i]-'0')*(int)(pow(n,len-i-1));
}
}
return ans;
}
string tentom(int m,int ten){
int len=0,a[49];
string s="";
while(ten){
a[++len]=ten%m;
ten/=m;
}
for(int i=len;i>=1;i--){
if(a[i]>=10)s+=char('A'+a[i]-10);
else s+=char(a[i]+'0');
}
return s;
}
int main(){
cin>>n>>s>>m;
ten=ntoten(n,s);
cout<<tentom(m,ten);
return 0;
}
解题思路:
任意进制转任意进制的模板题
7.P1604
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e3+39+7;
string s,s1;
int m,len,len1,len2,a[N],b[N],c[N];
int turn1(char c){
if(c>='0'&&c<='9')return c-'0';
else return c-'A'+10;
}
char turn2(int c){
if(c>=0&&c<=9)return char(c+'0');
else return char('A'+c-10);
}
int main(){
cin>>m>>s>>s1;
len=s.length();
len1=s1.length();
len2=max(len,len1)+1;
for(int i=0;i<len;i++)a[len-i]=turn1(s[i]);
for(int i=0;i<len1;i++)b[len1-i]=turn1(s1[i]);
for(int i=1;i<=len2;i++){
c[i]+=a[i]+b[i];
c[i+1]+=c[i]/m;
c[i]%=m;
}
while(c[len2]==0&&len2>1)len2--;
for(int i=len2;i>=1;i--)cout<<turn2(c[i]);
return 0;
}
解题思路:
高精加模板,只不过进位时,需要模m
8.P1017
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
void jin(int a){
int k=a%m;
a=a/m;
if(k<0){
k-=m;
a++;
}
if(a)jin(a);
if(k>9)cout<<char('A'+k-10);
else cout<<k;
}
int main(){
cin>>n>>m;
printf("%d=",n);
jin(n);
printf("(base%d)",m);
return 0;
}
解题思路:
与普通的转进制类似,只不过在余数小于0时,需要加上进制数即可

浙公网安备 33010602011771号