参考: https://www.cnblogs.com/-citywall123/p/9936971.html
题目:http://lx.lanqiao.cn/problem.page?gpid=T51
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
cin>>n;
for(int k=1;k<=n;k++)
{
string s1,s2;//s1为输入的原始的十六进制串,s2为转化成的二进制串
cin>>s1;
s2="";//初始化
for(int i=0;i<s1.length();i++)//遍历,字符串上加上每一位
{
switch(s1[i])
{
case '0':s2+="0000";break;
case '1':s2+="0001";break;
case '2':s2+="0010";break;
case '3':s2+="0011";break;
case '4':s2+="0100";break;
case '5':s2+="0101";break;
case '6':s2+="0110";break;
case '7':s2+="0111";break;
case '8':s2+="1000";break;
case '9':s2+="1001";break;
case 'A':s2+="1010";break;
case 'B':s2+="1011";break;
case 'C':s2+="1100";break;
case 'D':s2+="1101";break;
case 'E':s2+="1110";break;
case 'F':s2+="1111";break;
default:break;
}
}
int len=s2.length();
if(len%3==1)//三个二进制为一位八进制,二进制串前面补0,确保二进制串的长度为3的倍数
s2="00"+s2;
else if(len%3==2)
s2="0"+s2;
int flag=0;
for(int i=0;i<=s2.length()-3;i+=3)
{
int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+(s2[i+2]-'0');
if(num)
flag=1;//忽略前导0
if(flag)
cout<<num;
}
cout<<endl;
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<math.h>
#include<stack>
#define ll long long
#define M 0x3f3f3f3f3f
using namespace std;
ll change1(int r,string s)//r进制数转十进制数
{
ll len=0,ans=0;
while(s.length()!=len)
{
ans=ans*r;
if(s[len]>='A'&&s[len]<='Z')
ans=ans+s[len]-'A'+10;
else
ans=ans+s[len]-'0';
len++;
}
return ans;
}
void change2(int r,ll x)//将十进制数x转化成r进制数
{
stack<int>p;
if(x==0)//特判0
p.push(x);
while(x)//x除以基数,然后倒着取余数,用栈恰好可以实现
{
p.push(x%r);
x=x/r;
}
while(!p.empty())
{
switch(p.top())
{
case 10:cout<<'A';break;
case 11:cout<<'B';break;
case 12:cout<<'C';break;
case 13:cout<<'D';break;
case 14:cout<<'E';break;
case 15:cout<<'F';break;//这些都是为了能转化为十六进制。还可以继续增加
default:cout<<p.top();break;
}
p.pop();
}
cout<<endl;
}
void change3(int r,string s,int k)//将r进制数s转化成k进制数
{
ll temp=change1(r,s);
change2(k,temp);
}
int main()
{
int r,k;
string s;
cin>>r>>k>>s;//将r进制数s转化成k进制数
change3(r,s,k);
return 0;
}