十进制转别的模除,别的转十进制乘加。记住了。
另外这题还是不严谨,没说明字符串几位,多了就得大数处理了。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <cctype>
#include <climits>
using namespace std;
const int MAXN = 1005;
const int INF = INT_MAX;
int CharToInt(char x){
if(x >= '0' && x <= '9') return (x - '0');
else if(x >= 'a' && x <= 'f') return (10 + x - 'a');
}
int main(){
// freopen("in.txt", "r", stdin);
string str;
while(cin >> str){
str.erase(0, 2);
long long ans = 0;
for(int i = 0; i < str.size(); i++){
if(isupper(str[i])) str[i] = tolower(str[i]);
ans *= 16;
ans += CharToInt(str[i]);
}
printf("%lld\n", ans);
}
return 0;
}
任意进制之间转换,先转化为十进制,再转化为任意进制,为两类题的结合版。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <stack>
#include <cctype>
#include <climits>
using namespace std;
const int MAXN = 1005;
const int INF = INT_MAX;
int CharToInt(char x){
if(x >= '0' && x <= '9') return (x - '0');
else if(x >= 'A' && x <= 'F') return (10 + x - 'A');
}
char IntToChar(int x){
if(x >= 0 && x <= 9) return (x + '0');
else if(x >= 10 && x <= 16) return ( x - 10 + 'A');
}
int main(){
// freopen("in.txt", "r", stdin);
string n;
int a, b;
while(cin >> a >> n >> b){
bool flag = true;
int end = 0;
for(int i = 0; i < n.size(); i++){
if(n[i] == '0' && flag) end++;
if(n[i] != '0') flag = false;
if(islower(n[i])) n[i] = toupper(n[i]);
}
n.erase(0, end);//去前导0
long long decimal = 0;
for(int i = 0; i < n.size(); i++){
decimal *= a;
decimal += CharToInt(n[i]);
}
string ans;
if(decimal == 0) ans = "0";
while(decimal != 0){
ans += IntToChar(decimal%b);
decimal /= b;
}
reverse(ans.begin(), ans.end());
cout << ans << endl;
}
return 0;
}