- C++
备战CSP-J初赛21天打卡计划。第一天-进制转换
- 2024-8-30 16:37:54 @
进制转换
近4年初赛考察:
题号 | 题型 | 分值 | |
---|---|---|---|
2020 | 第9题 | 单项选择 | 2分 |
第17题 | 阅读程序 | 13.5分 | |
2021 | 第7题 | 单项选择 | 2分 |
2023 | 第2题 | ||
第9题 |
难易度:中等
不同的进制
在计算机中,除二进制外,比较常用的还有八进制和十六进制。
进制 | 基数 | 进位原则 | 基本符号 |
---|---|---|---|
二进制(B) | 2 | 逢2进1 | 0,1 |
八进制(O) | 8 | 逢8进1 | 0~7 |
十进制(D) | 10 | 逢10进1 | 0~9 |
十六进制(H) | 16 | 逢16进1 | 0 ~ 9,A ~ F |
Warning!
易错点:十六进制中的 A 相当于十进制中的 10。
进制转换
1. 十进制转化成K进制
(1)整数部分
短除法,除K取余,直到商是0,余数从下到上输出,即为K进制的整数部分。
例:十进制199转化成八进制
(2)小数部分
乘K取整,直到小数部分是0或达到指定精度,整数部分从上到下输出,即为K进制的小数部分。
例:十进制0.3125转化成八进制
Warning!
绝大部分浮点数无法用二进制精确表示,如 0.1。
2. K进制转化成十进制
每一位上的数字乘以对应的位权,整数部分位权是K(数位−1),小数部分的权分别为K^−1、K^−2 ……
千位 | 百位 | 十位 | 个位 | . | 十分位 | 百分位 | |
---|---|---|---|---|---|---|---|
数字 | 2 | 0 | 3 | 2 | . | 1 | 2 |
位权 | K^3 | K^2 | K^1 | K^0 | K^−1 | K^−2 |
例:八进制2032.12转换成十进制
(2032.12)8=2×8^3+0×8^2+3×8^1+2×8^0+1×8^−1+2×8^−2=(1050.15625)10
负数次幂
8^−1=1/8=0.125 8^−2=1/(8^2)=0.015625
3. 二、八、十六进制之间的转换
一个八进制位可以用 3 个二进制位来表示(2^3=8),一个十六进制位可以用 4 个二进制位来表示(2^4=16),反之同理。
十进制 | 二进制 | 八进制 | 十六进制 | 十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|---|---|---|---|
0 | 8 | 1000 | 10 | 8 | |||
1 | 9 | 1001 | 11 | 9 | |||
2 | 10 | 2 | 10 | 1010 | 12 | A | |
3 | 11 | 3 | 11 | 1011 | 13 | B | |
4 | 100 | 4 | 12 | 1100 | 14 | C | |
5 | 101 | 5 | 13 | 1101 | 15 | D | |
6 | 110 | 6 | 14 | 1110 | 16 | E | |
7 | 111 | 7 | 15 | 1111 | 17 | F |
例:(111100101110)2=(7456)8=(F2E)16
🌰 程序实现将n进制数转换成m进制。
//将n进制数字num,转换成m进制数
//(其中2 <= n,m <= 16,n进制数对应的十进制的值不超过int范围)
#include <iostream>
#include <string>
using namespace std;
int main() {
int n, m;
string num;
cin >> n >> num >> m;
//n进制num转换成十进制数ans
int ans = 0, w = 1;
int len = num.length();
for (int i = len - 1; i >= 0; i--){
if ('A' <= num[i] && num[i] <= 'F'){
ans = ans + (num[i] - 'A' + 10) * w;
} else {
ans = ans + (num[i] - '0') * w;
}
w *= n;
}
//十进制数ans转换成m进制
char mnum[100] = {}, cnt = 0;
while (ans != 0){
int tmp = ans % m;
if (tmp >= 10){
mnum[cnt++] = tmp - 10 + 'A';
}else{
mnum[cnt++] = tmp + '0';
}
ans /= m;
}
for (int i = cnt - 1; i >= 0; i--){
cout << mnum[i];
}
return 0;
}
📜历年真题
1、填空题
1 #include <iostream>
2 using namespace std;
3
4 long long n, ans;
5 int k, len;
6 long long d[1000000];
7
8 int main() {
9 cin >> n >> k;
10 d[0] = 0;
11 len= 1;
12 ans = 0;
13 for (long long i = 0; i <n; ++i) {
14 ++d[0];
15 for (int j = 0; j + 1<len; ++j) {
16 if (d[j] == k) {
17 d[j] = 0;
18 d[j + 1] += 1;
19 ++ans;
20 }
21 }
22 if (d[len - 1] == k) {
23 d[len - 1] = 0;
24 d[len] =1;
25 ++len;
26 ++ans;
27 }
28 }
29 cout << ans << endl;
30 return 0;
31 }
假设输入的 n 是不超过 2^62的正整数,k都是不超过 10000 的正整数,完成下面的判断题和单选题:
•判断题
1)若 k=1,则输出 ans时,len=n。( )
2)若 k>1,则输出 ans 时,len —定小于 n。( )
3)若 k>1,则输出 ans 时,k^len—定大于n。( )
•单选题
4)若输入的 n 等于:10^15,输入的 k 为 1,则输出等于( )。
A. 1
B. (10^30−10^15)/2
C. (10^30+10^15)/2
D. 10^15
5)若输入的 n 等于205,891,132,094,649(即 3^30),输入的 k 为 3,则输出等于( )。
A. 3^30
B. (3^30−1)/2
C. 3^30−1
D. (3^30+1)/2
6)若输入的 n 等于 100,010,002,000,090,输入的 k 为 10,则输出等于( )。
A. 11,112,222,444,543
B. 11,122,222,444,453
C. 11,122,222,444,543
D. 11,112,222,444,453
2、八进制数 32.1 对应的十进制数是( )。
A.24.125
B.24.250
C.26.125
D.26.250
3、二进制数101.11对应的十进制数是( )。
A.6.5
B.5.5
C.5.75
D.5.25
4、十进制小数 13.375 对应的二进制数是( )。
A. 1101.011
B. 1011.011
C. 1101.101
D. 1010.01
5、下列四个不同进制的数中,与其它三项数值上不相等的是
A. (269)16
B. (617)10
C. (1151)8
D. (1001101011)2
6、八进制数(12345670)8和(07654321)8的和为
A. (22222221)8
B. (21111111)8
C. (22111111)8
D. (22222211)8
7、数(101010)2和(166)8的 和 为 ( )
A. (10110000)2
B. (236)8
C. (158)10
D. (A0)16
1 条评论
-
xinao015 LV 1 @ 2024-9-1 14:49:29
×√√BCBDACAA
- 1