(任意进制转换)将 r 进制数转成 k 进制数
我们知道任意进制转换为十进制,都是乘以基数的多少次方,然后相加;
十进制转换为任意进制,都是除以基数,然后倒着取余数;
所以这里是用十进制数中转,实现任意进制数的转换
#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; }
等风起的那一天,我已准备好一切