洛谷:进制转换
普通的正进制转化
#include<bits/stdc++.h>
#include<unordered_set>
#define mem(a,b) memset(a,b,sizeof a)
#define cinios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define sca scanf
#define pri printf
#define ul u << 1
#define ur u << 1 | 1
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 110, M = N * N * 2;
int INF = 0x3f3f3f3f, mod = 1e9;
int n, m, k, T, S;
int z[N];
int main() {
string s;
cin >> n >> s >> m;
//把一个 n 进制数转化成 m 进制数
int sum = 0, e;
for (int i = 0; i < s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9')
e = s[i] - '0';
else e = s[i] - 'A' + 10;
sum = sum * n + e;//和十进制累计是一样的
}
//先把 n 进制转化成十进制
if (sum == 0)z[++k] = 0;//特判0
while (sum)
{
z[++k] = sum % m;//十进制再转 m 进制
sum /= m;
}
for (int i = k; i; i--) {
if (z[i] >= 10)pri("%c", z[i] - 10 + 'A');//输出不要忘了转字母
else pri("%d", z[i]);
}
return 0;
}
负进制转化
#include<bits/stdc++.h>
#include<unordered_set>
#define mem(a,b) memset(a,b,sizeof a)
#define cinios (ios::sync_with_stdio(false),cin.tie(0),cout.tie(0))
#define sca scanf
#define pri printf
#define ul u << 1
#define ur u << 1 | 1
//#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 10010, M = 100010;
int INF = 0x3f3f3f3f, mod = 1e9 + 7;
ll LNF = 1000000000000000;
int n, m, k, T, S;
char check(int a) { //10进制以上处理
if (a >= 10)return 'A' + a - 10;
return '0' + a;
}
int main() {
cin >> T >> k;//负数肯定没有正进制
string ans;
n = T;
if (n == 0)ans = "0";//特判
while (n)
{
int m = n % k;//由于 n 可以为负,m 有可能为负数,用负进制转
if (m < 0)n += k, m -= k;
//向前借一位,让进制数保证大于等于0
//进制数不能为负
n /= k;//之后才除
ans += check(m);
}
pri("%d=", T);
for (int i = ans.size() - 1; i >= 0; i--)//倒序
pri("%c", ans[i]);
pri("(base%d)\n", k);
return 0;
}