十進制轉別的模除,別的轉十進制乘加。記住了。
另外這題還是不嚴謹,沒說明字符串幾位,多了就得大數處理了。
#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;
}