进制转换-知识总结 记数系统 概念 记数系统是一套用于表示和处理数字的符号规则体系,包括数字符号和记数规则。
数字符号 数字符号有非常多的种类,数学和计算机中常用阿拉伯数字来进行记数,其他常见数字符号如下: 阿拉伯数字:1、2、3、4、5、…… 中文数字:一、二、三、四、五、…… 罗马数字:I、II、III、IV、V、……
进位制 进位制是日常最常用的技术规则,n进制就是使用哪种数字符号来记数,满n进1,常见的进位制包括: 十进制:使用0-9这10种数字符号记数,满10进1; 二进制:使用0-1这2种数字符号记数,满2进1; 八进制:使用0-7这8种数字符号记数,满8进1; 十六进制:使用0-9和A、B、C、D、E、F这16种数字符号记数,满16进1。
除此之外很多单位转换也利用了n进制的思想,例如: 5个手指为1只手 60秒为1分钟,60分钟为1个小时 365天为1年 1024B为1KB,1024KB为1MB,1024MB为1GB
进制转换 十进制转n进制 十进制转n进制分为整数部分的转换和小数部分的转换。十进制转n进制的过程与十进制求每一位上的数是什么的过程极为相似,如果不记得具体的求解方式,可以通过考虑如何获得十进制各个位上的数来梳理思路。
整数部分转换 将十进制整数转换为n进制整数的常用方法是不断地将十进制整数整除n,并记录每次的余数,直到商为0。最后,反转记录的余数序列,即得到对应的n进制整数。
示例 求十进制数456转二进制各个位上的值,从右到左依次是: 第1位:456%2=0,456/2=228 第2位:228%2=0,228/2=114 第3位:114%2=0,114/2=57 第4位:57%2=1,57/2=28 第5位:28%2=0,28/2=14 第6位:14%2=0,14/2=7 第7位:7%2=1,7/2=3 第9位:3%2=1,3/2=1 第9位:1%2=1,1/2=0
二进制整数为:111001000
小数部分转换 将十进制小数转化为n进制小数的方法是不断地将十进制数的小数部分乘以n,并记录整数部分,直到该数变成0,即可而获得n进制数的小数。
示例 求十进制数0.625转二进制各个位上的值,从左到右依次是: 第1位:0.6252=1.25,整数部分为1,1.25-1=0.25 第2位:0.252=0.5,整数部分为0,0.5-0=0.5 第3位:0.5*2=1,整数部分为1,1-1=0
二进制小数位:0.101
十进制转n进制代码
1#include <bits/stdc++.h>
2using namespace std;
3
4string decimal2base(int decimal_number, int base) {
5 if (decimal_number == 0) {
6 return "0";
7 }
8 string base_number;
9 while (decimal_number) {
10 int value = decimal_number % base;
11 char digit;
12 if (value < 10) {
13 digit = value + '0';
14 } else {
15 digit = value - 10 + 'A';
16 }
17 base_number += digit;
18 decimal_number /= base;
19 }
20 int len = base_number.length();
21 for (int i = 0; i < len / 2; ++i) {
22 swap(base_number[i], base_number[len - 1 - i]);
23 }
24 return base_number;
25}
26
27int main() {
28 int n;
29 cin >> n;
30 for (int i = 0; i < n; ++i) {
31 int base, decimal_number;
32 cin >> base >> decimal_number;
33 string base_number = decimal2base(decimal_number, base);
34 cout << base_number << endl;
35 }
36 return 0;
37}n进制转十进制 转换方法 n进制转十进制只需要把n进制每一位的数值乘以n进制这一位所表示的数值即可,类似于已知10进制数上的每一位求十进制数。
示例 对于十进制数:456.625 整数部分=4100+510+61=410^2+510^1+610^1 小数部分=60.1+20.01+50.001=610^(-1)+210^(-2)+510^(-3)
示例 对于二进制数:111001000.101 整数部分=12^8+12^7+12^6+02^5+02^4+12^3+02^2+02^1+02^0=456 小数部分=12^(-1)+02^(-2)+12^(-3)
n进制转十进制代码
1#include <bits/stdc++.h>
2using namespace std;
3
4int base2decimal(string &base_number, int base) {
5 int decimal_number = 0;
6 int len = base_number.length();
7 for (int i = 0; i < len; ++i) {
8 char digit = base_number[i];
9 int value;
10 if (digit >= '0' && digit <= '9') {
11 value = digit - '0';
12 }
13 if (digit >= 'A' && digit <='Z') {
14 value = digit - 'A' + 10;
15 }
16 decimal_number = decimal_number * base + value;
17 }
18 return decimal_number;
19}
20
21int main() {
22 int n;
23 cin >> n;
24 for (int i = 0; i < n; ++i) {
25 int base;
26 string base_number;
27 cin >> base >> base_number;
28 int decimal_number = base2decimal(base_number, base);
29 cout << decimal_number << endl;
30 }
31 return 0;
32}错误的题目要弄懂,不会的千万要来问老师⚠️
总结作业非常重要,请务必认真完成✔️
考试只有一次提交机会,请务必本地检查正确后再提交❇️
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
进制转换-选择题 在下列编码中,不能够和二进制"1101 1101"相等的是( )。 A. (221)₁₀ B. (335)₈ C. (dd)₁₆ D. (5d)₁₆
二进制数 11.01 在十进制下是( )。 A. 3.01 B. 3.05 C. 3.125 D. 3.25
已知大写字符'A'的 ASCII 编码的十六进制表示为 0x41,则字符'F'的 ASCII 编码 的十六进制表示为( )。 A. 46 B. 47 C. 48 D. 49
下列关于进制的叙述,不正确的是( )。 A. 正整数的二进制表示中只会出现 0 和 1。 B. 10 不是 2 的整数次幂,所以十进制数无法转换为二进制数。 C. 从二进制转换为 8 进制时,可以很方便地由低到高将每 3 位二进制位转换为 对应的一位 8 进制位。 D. 从二进制转换为 16 进制时,可以很方便地由低到高将每 4 位二进制位转换为对应的一位 16 进制位。
计算机中存储的数据都是二进制形式。因此,在使用 C++语言编写程序时,将 所有十进制数改写为相同数值的二进制数,会使得程序运行效率更高。 A. 正确 B. 错误
下列关于进制的叙述 ,正确的是( )。 A. 只有十进制和二进制能够用来表示小数 ,八进制和十六进制不可以。 B. 常用的进制包括二进制、八进制、十进制、十六进制,其他进制在日常生活中很少使用。 C. 对任意正整数 ,其二进制表示不会比它的十进制表示更短。 D. 正整数的八进制表示中 ,每一位可能出现的最大数字是 8
下列4个不同进制的数中,与其他三项不相等的是()。 A. (269)₁₆ B. (617)₁₀ C. (1151)₈ D. (1001101011)₂
8进制数32.1对应的十进制数是()。 A. 24.125 B. 24.250 C. 26.125 D. 26.250
下列选项中,与其他三个数不相等的是()。 A. (1A3)₁₆ B. (419)₁₀ C. (645)₈ D. (110100011)₂
下列二进制数相加的结果是()。 1011+1101=? A. 10100 B. 10110 C. 11000 D. 10000
进制转换-选择题答案 D 解析:首先,将二进制数 "1101 1101" 转换为十进制数是221,(5d)₁₆ 转换为十进制后不等于 221,而是等于 93。 D 解析:二进制 11.01 为 1∗2^1 +1∗2^0 +0∗2^-1 +1∗2^-2 =2+1+0+1/4=3.25 A 解析:F比A大5,因此F为0x41的基础上+5,即 0x46 B 解析:十进制数可以转换为二进制数,无论该数是否是 2 的整数次幂。转换过程是通过不断除以 2 并记录余数来实现的,直到商为 0 为止。然后将记录的余数按逆序排列,就得到了该十进制数的二进制表示。因此,这个选项的陈述是错误的。 B 解析:所有代码编译后都会转化为二进制指令来运行,所以无论二进制还是十进制,编译后的运行效率是一样的 C 解析: D 解析:D选项转化为十进制结果为619,其他均为617 C 解析:对于8进制数 32.1: 转换整数部分 32: 3 8^1 = 3 8 = 24 2 8^0 = 2 1 = 2 整数部分 32 转换为10进制是 24 + 2 = 26 转换小数部分 .1: 1 8^-1 = 1 (1/8) = 0.125 将整数部分和小数部分相加,得到: 26 + 0.125 = 26.125 因此,8进制数 32.1 对应的10进制数是 26.125。 C 解析:A选项是一个十六进制数。转换为十进制数的过程如下: 1 16^2 + A 16^1 + 3 16^0 = 1 256 + 10 16 + 3 1 = 256 + 160 + 3 = 419 B选项本身是一个十进制数,无需转换,其值就是 419。 C选项是一个八进制数。转换为十进制数的过程如下: 6 8^2 + 4 8^1 + 5 8^0 = 6 64 + 4 8 + 5 1 = 384 + 32 + 5 = 421 D选项是一个二进制数。转换为十进制数的过程如下: 1 2^8 + 1 2^7 + 0 2^6 + 1 2^5 + 0 2^4 + 0 2^3 + 0 2^2 + 1 2^1 + 1 2^0 = 1 256 + 1 128 + 0 64 + 1 32 + 0 16 + 0 8 + 0 4 + 1 2 + 1 1 = 256 + 128 + 32 + 2 + 1 = 419 因此,与其他三个数不相等的是:C. (645)₈ C 解析:二进制加法运算规则为:0 + 0 = 0,0 + 1 = 1,1 + 0 = 1,1 + 1 = 10(向高位进1)。 从右到左逐位相加:最低位:1 + 1 = 10,本位写0,向高位进1。 次低位:1 + 0 + 1(进位)= 10,本位写0,向高位进1。 第三位:0 + 1 + 1(进位)= 10,本位写0,向高位进1。 最高位:1+ 1 + 1(进位)= 11,本位写1,向更高位进1,此时无更高位,所以结果为11000。
L2114题解+参考代码 题目链接 进制判断:L2114
题解 我们需要判断给定的 N 个字符串是否可能是二进制、八进制、十进制、十六进制数。对于每个字符串,我们检查其每个字符,根据字符的范围来判断它是否符合相应进制的要求。
算法步骤 读取输入: 读取一个整数 N,表示有 N 个字符串。 读取接下来的 N 个字符串。 遍历每个字符串: 初始化四个布尔变量 isBinary、isOctal、isDecimal、isHexadecimal 为 true。 遍历字符串的每个字符,根据字符的范围来更新四个布尔变量: 如果字符不是 '0' 或 '1',将 isBinary 设为 false。 如果字符不在 '0'-'7' 之间,将 isOctal 设为 false。 如果字符不在 '0'-'9' 之间,将 isDecimal 设为 false。 如果字符不在 '0'-'9'、'A'-'F' 之间,将 isHexadecimal 设为 false。 输出结果: 对每个字符串,输出四个整数,分别表示该字符串是否可能是二进制、八进制、十进制、十六进制数。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 int N;
6 cin >> N;
7 string numbers[1000];
8
9 for (int i = 0; i < N; ++i) {
10 cin >> numbers[i];
11 }
12
13 for (int i = 0; i < N; ++i) {
14 string num = numbers[i];
15 bool isBinary = true, isOctal = true, isDecimal = true, isHexadecimal = true;
16 for (int j = 0; j < num.length(); j++) {
17 char ch = num[j];
18 if (ch != '0' && ch != '1') isBinary = false;
19 if (ch < '0' || ch > '7') isOctal = false;
20 if (ch < '0' || ch > '9') isDecimal = false;
21 if (!((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'F'))) isHexadecimal = false;
22 }
23 cout << isBinary << " " << isOctal << " " << isDecimal << " " << isHexadecimal << endl;
24 }
25
26 return 0;
27}L2115题解+参考代码 题目链接 回文平方数:L2115
题解 题目要求我们找到在 [1, 300] 范围内,其平方用 B 进制表示时是回文数的所有数。我们需要做以下几个步骤: 读取输入:读取进制 B。 遍历 [1, 300] 的所有数: 对于每个数,计算其平方。 将该平方数转换为 B 进制。 检查该 B 进制数是否为回文数。 输出结果:输出符合要求的数和其平方数的 B 进制表示。
算法步骤 定义函数 convertToBase: 参数:一个整数 num 和进制 base。 返回值:转换为 base 进制的字符串表示。 使用循环不断将 num 除以 base,并将余数转换为字符追加到结果字符串中。 结果字符串逆序即为 num 的 base 进制表示。 定义函数 isPalindrome: 参数:一个字符串 s。 返回值:布尔值,表示 s 是否为回文数。 检查字符串 s 的左右字符是否相同。 主函数: 读取输入的整数 B。 遍历 [1, 300] 的所有数,对于每个数,计算其平方,转换为 B 进制,检查是否为回文数。 如果是,输出该数和其平方的 B 进制表示。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4// 将 num 转换为 base 进制表示的字符串
5string convertToBase(int num, int base) {
6 string result;
7 while (num > 0) {
8 int digit = num % base;
9 if (digit < 10)
10 result += char('0' + digit);
11 else
12 result += char('A' + (digit - 10));
13 num /= base;
14 }
15 reverse(result.begin(), result.end());
16 return result.empty() ? "0" : result;
17}
18
19// 检查字符串 s 是否为回文
20bool isPalindrome(const string& s) {
21 int left = 0, right = s.size() - 1;
22 while (left < right) {
23 if (s[left] != s[right])
24 return false;
25 left++;
26 right--;
27 }
28 return true;
29}
30
31int main() {
32 // 读取输入
33 int B;
34 cin >> B;
35
36 // 遍历 [1, 300] 的所有数
37 for (int i = 1; i <= 300; ++i) {
38 int square = i * i;
39 string baseB = convertToBase(square, B);
40 if (isPalindrome(baseB)) {
41 cout << convertToBase(i, B) << " " << baseB << endl;
42 }
43 }
44
45 return 0;
46}