GESP三级C++考试语法知识(二、进制转换)课后训练

🎯《进制转换 18 道经典算法题(竞赛基础)》
第一关:十进制 ↔ 二进制(基础)
🧩 题1 数字翻译机
1、📖 故事
计算机王国有一台机器,它只会说 二进制语言。
输入一个十进制数字,让机器翻译成二进制。
2、输入
13 3、输出
1101 4、🧠 思考
(1)使用:
除2取余法 (2)步骤
13 ÷2 =6 余1 6 ÷2 =3 余0 3 ÷2 =1 余1 1 ÷2 =0 余1 (3)倒序
1101 5、💻 C++代码
#include<iostream> using namespace std; int main() { int n; cin>>n; int a[100],k=0; while(n>0) { a[k++]=n%2; n/=2; } for(int i=k-1;i>=0;i--) cout<<a[i]; } 🧩 题2 机器人读数字
1、📖 故事
机器人只认识 二进制。
但你给了它一个二进制数字,让它算出十进制是多少。
2、输入
10101 3、输出
21 4、🧠 思考
(1)权值展开:
1×2⁴ 0×2³ 1×2² 0×2¹ 1×2⁰ (2)计算
16+4+1=21 5、💻 C++代码
#include<iostream> #include<string> using namespace std; int main() { string s; cin>>s; int ans=0; for(int i=0;i<s.size();i++) { ans=ans*2+(s[i]-'0'); } cout<<ans; } 第二关:二进制 ↔ 八进制
🧩 题3 二进制压缩机
1、📖 故事
计算机觉得二进制太长了,于是发明了一种压缩方法:
3个二进制 = 1个八进制 备注:本题中只考虑正数,不考虑负数。
2、输入
101110 3、输出
56 4、🧠 思考
(1)分组
101 110 (2)转换
101 =5 110 =6 5、💻 C++代码
方法1:
#include<iostream> #include<string> using namespace std; int main() { string s; cin >> s; // 补0到3的倍数 while(s.size() % 3 != 0) s = "0" + s; for(int i = 0; i < s.size(); i += 3) { string t = s.substr(i,3); if(t == "000") cout << 0; if(t == "001") cout << 1; if(t == "010") cout << 2; if(t == "011") cout << 3; if(t == "100") cout << 4; if(t == "101") cout << 5; if(t == "110") cout << 6; if(t == "111") cout << 7; } }方法2:
#include<iostream> #include<string> using namespace std; int main() { string s; cin >> s; while(s.size() % 3 != 0) s = "0" + s; for(int i = 0; i < s.size(); i += 3) { int x = 0; x = (s[i]-'0')*4 + (s[i+1]-'0')*2 + (s[i+2]-'0'); cout << x; } }🧩 题4 八进制翻译官
1、📖 故事
输入一个八进制数字,翻译成十进制。
2、输入
157 3、输出
111 4、🧠 思考
(1)权值展开
1×8² 5×8¹ 7×8⁰ (2) 计算
64+40+7=111 5、💻 C++代码
#include<iostream> #include<string> using namespace std; int main() { string s; cin>>s; int ans=0; for(int i=0;i<s.size();i++) ans=ans*8+(s[i]-'0'); cout<<ans; } 第三关:二进制 ↔ 十六进制
🧩 题5 十六进制魔法石
1、📖 故事
魔法师使用 十六进制符号:
A=10 B=11 C=12 D=13 E=14 F=15 2、输入
FF 3、输出
255 4、🧠 思考
F=15 (1)权值展开
15×16¹ + 15×16⁰ (2)计算
240+15=255 5、💻 C++代码
#include<iostream> #include<string> using namespace std; int main() { string s; cin>>s; int ans=0; for(int i=0;i<s.size();i++) { int x; if(s[i]>='0'&&s[i]<='9') x=s[i]-'0'; else x=s[i]-'A'+10; ans=ans*16+x; } cout<<ans; } 🧩 题6 二进制变十六进制
1、输入
11010110 2、输出
D6 3、🧠 思考
4位一组 1101 0110 D6 4、💻 C++代码
#include<iostream> #include<string> using namespace std; int main() { string s; cin >> s; while(s.size() % 4 != 0) s = "0" + s; for(int i = 0; i < s.size(); i += 4) { int x = 0; x = (s[i]-'0')*8 + (s[i+1]-'0')*4 + (s[i+2]-'0')*2 + (s[i+3]-'0') ; if(x>=0 && x<10) cout <<char('0'+x); else cout<<(char)('A'+x-10); } }第四关:任意进制转换
🧩 题7 十进制 → 八进制
1、输入
100 2、输出
144 3、💻 C++代码
#include<iostream> using namespace std; int main() { int n; cin>>n; int a[100],k=0; while(n>0) { a[k++]=n%8; n/=8; } for(int i=k-1;i>=0;i--) cout<<a[i]; } 🧩 题8 十进制 → 十六进制
1、输入
255 2、输出
FF 3、💻 C++代码
#include<iostream> using namespace std; int main() { int n; cin>>n; char a[100]; int k=0; while(n>0) { int r=n%16; if(r<10) a[k++]=r+'0'; else a[k++]=r-10+'A'; n/=16; } for(int i=k-1;i>=0;i--) cout<<a[i]; } 第五关:综合题
🧩 题9 任意进制 → 十进制
1、输入
base = 7 number = 123 2、输出
66 3、权值展开
1×7² 2×7¹ 3×7⁰ 4、💻 C++代码
#include<iostream> #include<string> using namespace std; int main() { int base; cin >> base; string s; cin>>s; int ans=0; for(int i=0;i<s.size();i++) { int x; if(s[i]>='0'&&s[i]<='9') x=s[i]-'0'; else x=s[i]-'A'+10; ans = ans * base + x; } cout<<ans; } 🧩 题10 十进制 → 任意进制
1、输入
n=100 base=3 2、输出
10201 3、万能模板
#include<iostream> using namespace std; int main() { int n,base; cin>>n>>base; int a[100],k=0; while(n>0) { a[k++]=n%base; n/=base; } for(int i=k-1;i>=0;i--) cout<<a[i]; } 故事题目:加强训练
🎯 第11题 二进制压缩成八进制
1、📖 故事
在 计算机王国里,士兵们每天发送大量 二进制情报:
101011 国王觉得太长了,于是发明了一种 压缩魔法:
每 3个二进制数字 可以变成 1个八进制数字
现在请你帮国王把情报压缩。
2、💻 C++代码
通过十进制转换:
1️⃣ 二进制 → 十进制
2️⃣ 十进制 → 八进制
#include<iostream> #include<string> using namespace std; int main() { string s; cin>>s; int n=0; for(int i=0;i<s.size();i++) n=n*2+(s[i]-'0'); int a[100],k=0; while(n>0) { a[k++]=n%8; n/=8; } for(int i=k-1;i>=0;i--) cout<<a[i]; } 🎯 第12题 八进制变成二进制
1、📖 故事
程序员魔法师喜欢用八进制写数字:
37 但是计算机只能看懂 二进制。
于是你要当 翻译官。
2、💻 C++代码
通过十进制转换:
八进制 → 十进制 → 二进制 #include<iostream> #include<string> using namespace std; int main() { string s; cin>>s; int n=0; for(int i=0;i<s.size();i++) n=n*8+(s[i]-'0'); int a[100],k=0; while(n>0) { a[k++]=n%2; n/=2; } for(int i=k-1;i>=0;i--) cout<<a[i]; } 🎯 第13题 十六进制变二进制
1、📖 故事
在 黑客学校,学生们用一种神秘语言:
A5 老师说:
每一位十六进制都能变成 4位二进制
2、💻 C++代码
通过十进制转换:
十六进制 → 十进制 → 二进制 #include<iostream> #include<string> using namespace std; int main() { string s; cin>>s; int n=0; for(int i=0;i<s.size();i++) { int x; if(s[i]>='0'&&s[i]<='9') x=s[i]-'0'; else x=s[i]-'A'+10; n=n*16+x; } int a[100],k=0; while(n>0) { a[k++]=n%2; n/=2; } for(int i=k-1;i>=0;i--) cout<<a[i]; } 🎯 第14题 二进制变十六进制
1、📖 故事
计算机给你一个 超长二进制密码
11110000 国王要求把它翻译成 十六进制密钥。
2、💻 C++代码
#include<iostream> using namespace std; int main() { string s; cin>>s; int n=0; for(int i=0;i<s.size();i++) n=n*2+(s[i]-'0'); char a[100]; int k=0; while(n>0) { int r=n%16; if(r<10) a[k++]=r+'0'; else a[k++]=r-10+'A'; n/=16; } for(int i=k-1;i>=0;i--) cout<<a[i]; } 🎯 第15题 统计二进制中1的数量
1、📖 故事
在 机器人军队里:
1 = 士兵 0 = 空地 现在输入n,转换成二进制是
1011011 请问有多少士兵?
2、📊 图解
1 0 1 1 0 1 1 ↑ ↑ ↑ ↑ ↑ 一共
5个 3、💻 C++代码
#include<iostream> using namespace std; int main() { int n; cin>>n; int cnt=0; while(n>0) { if(n%2==1) cnt++; n/=2; } cout<<cnt; } 🎯 第16题 求二进制长度
1、📖 故事
计算机想知道:
一个数字需要多少 二进制位 才能表示?
例如
13 2、📊 图解
13 = 1101 长度:
4 3、💻 C++代码
#include<iostream> using namespace std; int main() { int n; cin>>n; int len=0; while(n>0) { n/=2; len++; } cout<<len; } 🎯 第17题 输出8位二进制
1、📖 故事
计算机存储数字时,常用 8位二进制
例如:
5 必须写成
00000101 2、📊 图解
5 → 101 补0 → 00000101 3、💻 C++代码
#include<iostream> using namespace std; int main() { int n; cin>>n; int a[8]={0}; for(int i=7;i>=0;i--) { a[i]=n%2; n/=2; } for(int i=0;i<8;i++) cout<<a[i]; } 🎯 第18题 找最低位的1
1、📖 故事
数字有一个 隐藏的最右边的1。
(1)例如:
12 (2)二进制:
1100 (3)最低位1是
0100 2、💻 C++代码
#include<iostream> using namespace std; int main() { int n; cin>>n; cout<<(n & -n); } 需要后面课程,掌握按位操作符。
(这是竞赛经典技巧)
🎓 做完18题学生掌握
核心技能:
✅ 二进制
✅ 八进制
✅ 十六进制
✅ 任意进制转换
✅ C++多种实现方式
这正是 初学阶段很重要的知识点。