今天网络赛有道题涉及进制转换,最后时间不够了,气死我了。还是对进制转换太生疏了,所以决定对进制转换总结一下。
格式 | 进制 |
---|---|
%d | 10进制 |
%o | 8进制 |
%x | 16进制(小写) |
%X | 16进制(大写) |
虽然没有二进制,但可以直接读写8和16进制。
#include
using namespace std;
int main() {
int x;
scanf("%d", &x);
printf("%d\n", x);
printf("%o\n", x);
printf("%x\n", x);
printf("%X\n\n", x);
scanf("%o", &x);
printf("%d\n", x);
printf("%o\n", x);
printf("%x\n", x);
printf("%X\n\n", x);
scanf("%x", &x);
printf("%d\n", x);
printf("%o\n", x);
printf("%x\n", x);
printf("%X\n", x);
return 0;
}
如果要调用转换结果,可以用sprintf()和sscanf()进行操作。
#include
using namespace std;
int main() {
int x, y;
char s[100];
scanf("%d", &x);//x从10进制转换为8进制存进y
sprintf(s,"%o", x);
sscanf(s, "%o", &y);
//得到y并进行相关操作。。
printf("%o\n\n", y);
scanf("%o", &x);//x从8进制转换为16进制存进y
sprintf(s, "%x", x);
sscanf(s, "%x", &y);
printf("%x\n\n", y);
scanf("%X", &x);//x从16进制转换为10进制存进y
sprintf(s, "%d", x);
sscanf(s, "%d", &y);
printf("%d\n\n", y);
return 0;
}
c++的与c类似,也可以直接读写8进制和16进制。
格式 | 进制 |
---|---|
dec | 10进制 |
oct | 8进制 |
hex | 16进制 |
#include
using namespace std;
int main() {
int x;
cin >> x;
cout << oct << x << "\n\n";//10转8
cin >> oct >> x;
cout << hex << x << "\n\n";//8转16
cin >> hex >> x;
cout << dec << x;//16转10
return 0;
}
以及对应的stringstream,头文件是< sstream >
#include
using namespace std;
int main() {
int x, y;
stringstream st;
cin >> x; //10转8存进y
st << oct << x;
st >> dec >> y;
cout << y;
return 0;
}
比赛主要是用C/C++,其他语言就暂不罗列了。
自己写的进制转换函数,理论是到36进制(因为字母不够 ),如果要字母大写改一下就好了,若有错请斧正。
string trans(string num ,int from ,int to) { //num待转换数,from和to表示进制
ll tmp, ten = 0;
string ans;
char c;
for(int i=0;i<num.size();i++){ //from进制转换为10进制
ten *= from;
if (num[i] >= '0' && num[i] <= '9')
tmp = num[i] - '0';
else tmp = num[i] - 'a' + 10;
ten += tmp;
}
//cout << ten << "\n";
while (ten) { //10进制转换为to进制
tmp = ten % to;
c = tmp < 10 ? tmp + '0' : tmp - 10 + 'a';
ans += c;
ten /= to;
}
reverse(ans.begin(), ans.end());
return ans;
}
测试结果
#include
using namespace std;
typedef long long ll;
string trans(string num ,int from ,int to) { //num待转换数,from和to表示进制
ll tmp, ten = 0;
string ans;
char c;
for(int i=0;i<num.size();i++){ //from进制转换为10进制
ten *= from;
if (num[i] >= '0' && num[i] <= '9')
tmp = num[i] - '0';
else tmp = num[i] - 'a' + 10;
ten += tmp;
}
//cout << ten << "\n";
while (ten) { //10进制转换为to进制
tmp = ten % to;
c = tmp < 10 ? tmp + '0' : tmp - 10 + 'a';
ans += c;
ten /= to;
}
reverse(ans.begin(), ans.end());
return ans;
}
int main() {
//测试2,8,10,16进制相互转换
cout << trans("351306", 8, 2) << "\n";
cout << trans("946351", 10, 2) << "\n";
cout << trans("a6b816", 16, 2) << "\n";
cout << "\n";
cout << trans("101111111001", 2, 8) << "\n";
cout << trans("13541913", 10, 8) << "\n";
cout << trans("a6b8c9def", 16, 8) << "\n";
cout << "\n";
cout << trans("10000001", 2, 10) << "\n";
cout << trans("6543210", 8, 10) << "\n";
cout << trans("fe60a6b8c", 16, 10) << "\n";
cout << "\n";
cout << trans("1101010101", 2, 16) << "\n";
cout << trans("66240", 8, 16) << "\n";
cout << trans("98109813", 10, 16) << "\n";
return 0;
}
未经同意,请勿转载。(
本不富裕的访问量雪上加霜)
博主首页:https://blog.csdn.net/qq_45034708
你的点赞将会是我最大的动力,关注一波