• 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^−1K^−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 条评论

  • 1