#include <iostream>
#include <cstring>
#include <vector>
#include <sstream>
using namespace std;
string mul(string a, int b) { //字符串乘法
int carry = 0;
for (int i = a.size() - 1; i >= 0; --i) {
int current = carry + (a[i]-'0') * b;
a[i] = current % 10 + '0';
carry = current / 10;
}
while (carry != 0) { //如果有进位在前面补
int head = carry % 10;
carry /= 10;
stringstream ss;
ss << head;
a = ss.str() + a;
}
return a;
}
string add(string a, char c) { //字符串加法
int carry = 0;
int temp;
if (c >= '0' && c <= '9') temp = c - '0';
else {
temp = c - 'A' + 10;
}
carry = temp;
for (int i = a.size() - 1; i >= 0; --i) {
int current = carry + (a[i] - '0');
a[i] = current % 10 + '0';
carry = current / 10;
}
while (carry != 0) { //如果有进位在前面补
int head = carry % 10;
carry /= 10;
stringstream ss;
ss << head;
a = ss.str() + a;
}
return a;
}
char qu_yu(string a, int b) { //字符串取余
int change; //临时存放要转换的值
int c[1000]; //存放临时计算结果
memset(c, 0, 1000);
for (int i = 0; i < a.length(); ++i)
c[i] = a[i] - '0';
for (int i = 0; i < a.size(); ++i) {
if (i != a.size() - 1)
c[i + 1] = (c[i] * 10 + c[i + 1]) % b;
else
c[i + 1] = c[i] % b;
}
change = c[a.length()];
if (change >= 0 && change <= 9) return change + '0';
else return change - 10 + 'A';
}
string divide(string str, int x) { //字符串除法
int remainder = 0;
for (int i = 0; i < str.size(); ++i) {
int current = remainder * 10 + str[i] - '0';
str[i] = current / x + '0';
remainder = current % x;
}
int pos = 0;
while (str[pos] == '0') {
pos++;
}
return str.substr(pos);
}
int main()
{
int m, n;
while (cin >> m >> n) {
string s;
cin >> s;
string temp = "0";
for (int i = 0; i < s.size(); ++i) {
temp = mul(temp, m);
temp = add(temp, s[i]);
}
vector<char> re;
while (!temp.empty()) {
re.push_back(qu_yu(temp, n));
temp = divide(temp, n);
}
for (int i = re.size() - 1; i >= 0; --i) {
cout << re[i];
}
cout << endl;
}
}
牛客网 KY235 进制转换2
最新推荐文章于 2023-07-24 23:38:29 发布