目录
[B3620 x 进制转 10 进制 - 洛谷](#B3620 x 进制转 10 进制 - 洛谷)
[B3619 10 进制转 x 进制 - 洛谷](#B3619 10 进制转 x 进制 - 洛谷)
[P1555 [USACO11NOV] 尴尬的数字 Awkward Digits B - 洛谷](#P1555 [USACO11NOV] 尴尬的数字 Awkward Digits B - 洛谷)
B3620 x 进制转 10 进制 - 洛谷
cpp
// B3620 x 进制转 10 进制
#include <bits/stdc++.h>
using namespace std;
int n;
string num;
long long res = 0;
int char2int(char c){
// 字符转换成int类型
if (c >= '0' && c <= '9')
{ // 如果数字是在0-9之内的
return c - '0';
}
else
return c - 'A' + 10; // 如果数字是 A B C D 这种的
}
int main(){
cin >> n;
cin >> num;
res = char2int(num[0]);
// 类比2进制转换成10进制的过程
for (int i = 1; i < num.size(); i++){
// 从最高位开始
res = res * n + char2int(num[i]);
}
cout << res;
return 0;
}
B3619 10 进制转 x 进制 - 洛谷
cpp
// B3619 10 进制转 x 进制
// 基于短除法
#include <bits/stdc++.h>
using namespace std;
long long n;
int x;
vector<char> res;
char int2char(int num){
if (num >= 0 && num <= 9)
return '0' + num;
else
return 'A' + num - 10;
}
int main(){
cin >> n >> x;
while (n >= x)
{ // 短除法除到最后n是小于x的
int yuShu = n % x; // 取余数
res.push_back(int2char(yuShu));
n = n / x;
}
res.push_back(int2char(n)); // 别忘了n
for (int i = res.size() - 1; i >= 0; i--)
cout << res[i];
// 短除法是先获取的低位后获取的高位,所以需要逆序输出
return 0;
}
P1555 [USACO11NOV] 尴尬的数字 Awkward Digits B - 洛谷
cpp
// P1555 [USACO11NOV] 尴尬的数字 Awkward Digits B
#include <bits/stdc++.h>
using namespace std;
string a, b;
int char2int(char c){
// 字符转换成int类型
if (c >= '0' && c <= '9')
{ // 如果数字是在0-9之内的
return c - '0';
}
else
return c - 'A' + 10; // 如果数字是 A B C D 这种的
}
long long x2Ten(string t, int n){
// x进制转换10进制
long long res = char2int(t[0]);
// 类比2进制转换成10进制的过程
for (int i = 1; i < t.size(); i++){
// 从最高位开始
res = res * n + char2int(t[i]);
}
return res;
}
bool jd(long long n){
// 把新数转三进制,逐位和原三进制字符串b比,统计不同位数
int idx = 0;
int cnt = 0;
while (n >= 3){
int yuShu = n % 3;
char tmp = b[b.size() - 1 - idx];
if (char2int(tmp) != yuShu) cnt++;
n = n / 3;
idx++;
if (cnt > 1) return false;
}
if (n != char2int(b[0])) cnt++;
if (cnt != 1 || idx != b.size() - 1)
return false;
// 如果不同的位数不等于1 或 n转成3进制后长度和b不一样那么就false
return true;
}
int main(){
cin >> a >> b;
long long ta = x2Ten(a, 2);
long long tb = x2Ten(b, 3);
// // 从高位开始遍历 去改变2进制的某一位
for (int i = 0; i < a.size(); i++){
long long l = 1 << (a.size() - i - 1);
long long ta_tmp = -1;
if (a[i] == '0'){
// 如果第i位是0 那么我们就把它变成1 那么ta就会加上 l
ta_tmp = ta + l;
}
else
ta_tmp = ta - l;
if (jd(ta_tmp)){
cout << ta_tmp;
break;
}
}
return 0;
}