【进制转换/高精度取余】acwing124
传送门
a进制的数s,转换成b进制的数。
每次s对b取余的结果就是b进制数的低位。然后s再除以b,再重复取余,直到商0。
涉及高精度取余的操作,从高位到地位,每次s[i]%b = r,得到的余数借位到下一位的时候,由于可能不是十进制,所以下一位是r * a + s[i+1];最后所有位除法操作结束剩下的r就是一位结果
#include<bits/stdc++.h>
using namespace std;
int e[505],d[505];
string ts(string a, int x, int y)
{
vector<int> scr;
for(int i = 0; i < a.size(); i++) scr.push_back(e[a[i]]);
reverse(scr.begin(), scr.end());
vector<int> res;
while(scr.size())
{
int r = 0;
for(int i = scr.size() - 1; i >= 0; i--)
{
scr[i] += r * x;
r = scr[i] % y;
scr[i] /= y;
}
res.push_back(r);
while(scr.size() > 0 && *scr.rbegin() == 0) scr.pop_back();
}
reverse(res.begin(), res.end());
string b = "";
for(auto &i : res) b += (char)d[i];
return b;
}
int main()
{
int cnt = 0;
for(int i = '0'; i <= '9'; i++) e[i] = cnt,d[cnt] = i, cnt++;
for(int i = 'A'; i <= 'Z'; i++) e[i] = cnt,d[cnt] = i, cnt++;
for(int i = 'a'; i <= 'z'; i++) e[i] = cnt,d[cnt] = i, cnt++;
int n; cin >> n;
for(int i = 1; i <= n; i++)
{
vector<int> ans;
int a,b; cin >> a >> b;
string s; cin >> s;
cout << a << " " << s <<endl;
cout << b << " " << ts(s, a, b) << endl << endl;;
}
}
发表评论